Java 按常量特定数据在枚举常量中查找

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

我需要通过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 ,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)时间内进行。