在java中使用枚举的错误代码表示

时间:2013-07-02 16:42:38

标签: java enums

我有一堆错误代码由服务器返回给我。基于这些错误代码,我需要为每个错误代码编写一些逻辑。我不想在我的功能中放置普通错误。表示这些错误代码的最佳方法是什么? 我现在正在使用枚举,

 private enum LoginErrorCode{

   EMAIL_OR_PASSWORD_INCORRECT("101"),
   EMAIL_INCORRECT("102");

    private final String code;

    LoginErrorCode(String code){
      this.code=code;
    }

    public String getCode(){
      return code;
    }
  }

但是如果我得到一个我不知道的错误代码,我不知道如何处理它。请告诉我。

2 个答案:

答案 0 :(得分:2)

以下是使用您通常用来处理错误代码的Enum的解决方案,如您在场景中所述:

import java.util.HashMap;
import java.util.Map;

public class EnumSample {

    public static enum LoginErrorCode {

        EMAIL_OR_PASSWORD_INCORRECT("101"), EMAIL_INCORRECT("102"), UNKNOWN_ERROR_CODE("---");

        private static Map<String, LoginErrorCode> codeToEnumMap;

        private final String code;

        LoginErrorCode(String code) {
            this.code = code;
        }

        public String getCode() {
            return code;
        }


        /**
         * Looks up enum based on code.  If code was not registered as enum, it returns UNKNOWN_ERROR_CODE
         * @param code
         * @return
         */
        public static LoginErrorCode fromCode(String code) {
            // Keep a hashmap of mapping between code and corresponding enum as a cache.  We need to initialize it only once
            if (codeToEnumMap == null) {
                codeToEnumMap = new HashMap<String, EnumSample.LoginErrorCode>();
                for (LoginErrorCode aEnum : LoginErrorCode.values()) {
                    codeToEnumMap.put(aEnum.getCode(), aEnum);
                }
            }

            LoginErrorCode enumForGivenCode = codeToEnumMap.get(code);
            if (enumForGivenCode == null) {
                enumForGivenCode = UNKNOWN_ERROR_CODE;
            }

            return enumForGivenCode;
        }
    }

    public static void main(String[] args) {

        System.out.println( LoginErrorCode.fromCode("101")); //Prints EMAIL_OR_PASSWORD_INCORRECT
        System.out.println( LoginErrorCode.fromCode("102")); //Prints EMAIL_INCORRECT
        System.out.println( LoginErrorCode.fromCode("999")); //Prints UNKWNOWN_ERROR_CODE
    }
}

答案 1 :(得分:0)

enum的要点是没有无效值;无效值不存在。不能有LoginErrorCode.EMAIL_ERROR_DOES_NOT_EXIST值。您不应该处理不存在的值。这就是使enum成为最佳表示的原因,因为您有一组已知的值来表示。

修改

由于您需要将错误代码字符串翻译为枚举,因此请在枚举值中包含Map错误代码Strings

public enum LoginErrorCode
{
    EMAIL_OR_PASSWORD_INCORRECT,
    EMAIL_INCORRECT;

    private static Map<String, LoginErrorCode> map;
    // static initializer
    static {
        map = new HashMap<String, LoginErrorCode>();
        map.put("101", EMAIL_OR_PASSWORD_INCORRECT);
        map.put("102", EMAIL_INCORRECT);
    }
    public static LoginErrorCode fromCode(String code)
    {
        return map.get(code);
    }
}

fromCode方法会在无效代码上返回null