Java 按常量特定数据在枚举常量中查找
我需要通过int在枚举中查找。枚举如下所示:Java 按常量特定数据在枚举常量中查找,java,enums,Java,Enums,我需要通过int在枚举中查找。枚举如下所示: public enum ErrorCode{ MissingReturn(1,"Some long String here"), InvalidArgument(2,"Another long String here"); private final int shortCode ; private final String detailMessage; ErrorCode(shortCode
public enum ErrorCode{
MissingReturn(1,"Some long String here"),
InvalidArgument(2,"Another long String here");
private final int shortCode ;
private final String detailMessage;
ErrorCode(shortCode ,detailMessage){
this.shortCode = shortCode ;
this.detailMessage= detailMessage;
}
public String getDetailedMessage(){
return this.detailMessage;
}
public int getShortCode(){
return this.shortCode ;
}
}
现在需要有一个查找方法,该方法将接受int
代码,并应返回与存储在Enum
中的代码相关的String
消息。传递“1”应返回字符串“此处有一些长字符串”。实现此功能的最佳方式是什么
public static String lookUpMessageFromCode(int code){
}
附言:类
EnumMap
对这种用例有用吗?如果是,请告诉我原因?根据与enum
关联的int
值,我将向enum
类添加一个ErrorCode
的静态数组,或一个静态映射,并使用它在messagefromcode方法中进行查找。在您的情况下,数组更合适,因为您有较小的值1
和2
。我还会将签名更改为返回ErrorCode
private static final ErrorCode[] allErrorCodes = new ErrorCode[] {
null, MissingReturn, InvalidArgument
};
public static ErrorCode lookUpByCode(int code) {
// Add range checking to see if the code is valid
return allErrorCodes[code];
}
需要该消息的呼叫者将按如下方式获得该消息:
String message = ErrorCode.lookUpByCode(myErrorCode).getDetailedMessage();
根据与enum
关联的int
值,我将向enum
类添加一个静态ErrorCode
数组或一个静态Map
,并使用它在messagefromcode方法中进行查找。在您的情况下,数组更合适,因为您有较小的值1
和2
。我还会将签名更改为返回ErrorCode
private static final ErrorCode[] allErrorCodes = new ErrorCode[] {
null, MissingReturn, InvalidArgument
};
public static ErrorCode lookUpByCode(int code) {
// Add range checking to see if the code is valid
return allErrorCodes[code];
}
需要该消息的呼叫者将按如下方式获得该消息:
String message = ErrorCode.lookUpByCode(myErrorCode).getDetailedMessage();
我只需遍历枚举值并检查代码。此解决方案允许您利用现有的Enum
,而无需创建另一个要管理的对象
public enum ErrorCode {
MissingReturn(1, "Some long String here"),
InvalidArgument(2, "Another long String here");
private final int shortCode;
private final String detailMessage;
ErrorCode(int shortCode, String detailMessage) {
this.shortCode = shortCode;
this.detailMessage = detailMessage;
}
public String getDetailedMessage() {
return this.detailMessage;
}
public int getShortCode() {
return this.shortCode;
}
public static String lookUpMessageFromCode(int code) {
String message = null;
for (ErrorCode errorCode : ErrorCode.values()) {
if (errorCode.getShortCode() == code) {
message = errorCode.getDetailedMessage();
break;
}
}
return message;
}
public static void main(String[] args) {
System.out.println(ErrorCode.lookUpMessageFromCode(1));
System.out.println(ErrorCode.lookUpMessageFromCode(2));
}
}
需要注意的一件事
Enum
构造函数缺少有关其参数的类型信息
ErrorCode(int shortCode, String detailMessage) {
this.shortCode = shortCode;
this.detailMessage = detailMessage;
}
我只需遍历枚举值并检查代码。此解决方案允许您利用现有的Enum
,而无需创建另一个要管理的对象
public enum ErrorCode {
MissingReturn(1, "Some long String here"),
InvalidArgument(2, "Another long String here");
private final int shortCode;
private final String detailMessage;
ErrorCode(int shortCode, String detailMessage) {
this.shortCode = shortCode;
this.detailMessage = detailMessage;
}
public String getDetailedMessage() {
return this.detailMessage;
}
public int getShortCode() {
return this.shortCode;
}
public static String lookUpMessageFromCode(int code) {
String message = null;
for (ErrorCode errorCode : ErrorCode.values()) {
if (errorCode.getShortCode() == code) {
message = errorCode.getDetailedMessage();
break;
}
}
return message;
}
public static void main(String[] args) {
System.out.println(ErrorCode.lookUpMessageFromCode(1));
System.out.println(ErrorCode.lookUpMessageFromCode(2));
}
}
需要注意的一件事
Enum
构造函数缺少有关其参数的类型信息
ErrorCode(int shortCode, String detailMessage) {
this.shortCode = shortCode;
this.detailMessage = detailMessage;
}
这是另一个选择:
public static String lookUpMessageFromCode(int code){
for(ErrorCode ec:ErrorCode.values()){
if(ec.shortCode==code)
return ec.detailMessage;
}
return null;
}
这是另一个选择:
public static String lookUpMessageFromCode(int code){
for(ErrorCode ec:ErrorCode.values()){
if(ec.shortCode==code)
return ec.detailMessage;
}
return null;
}
在过去的几天里,我已经多次看到这个问题(和回答)。短代码值是任意的(没有特定的模式),还是它们只是1、2、3等等?我在过去的几天里已经多次看到这个问题(和回答)。短代码值是任意的(没有特定的模式),还是它们只是1、2、3,等等?我们不能使用EnumMap
?请看最后一行。@Geek不,因为EnumMap
用于从enum
映射,而您的任务要求从整数映射到enum
。谢谢您的澄清。@dasblinkenlight仅供讨论,与仅使用枚举值相比,创建ErrorCode数组有什么好处?@KevinBowerso这通常是在使用Enum
的代码中完成的,而不是Enum
实现本身。我们不能使用EnumMap
吗?请参阅最后一行。@Geek No,因为EnumMap
用于从enum
映射,而您的任务要求从整数映射到enum
。感谢您的澄清。@dasblinkenlight仅供讨论,与仅使用枚举值相比,创建ErrorCode数组的优点是什么?@KevinBowerso这通常是在使用Enum
的代码中完成的,而不是Enum
实现本身。如果枚举中有大量常量,则程序无法很好地扩展。dasblinkenlight的答案在这方面会做得很好,因为查找将在O(1)时间内进行。如果枚举中有大量常量,则程序的伸缩性将不好。dasblinkenlight的答案在这方面会做得很好,因为查找将在O(1)时间内进行。