为什么 java 枚举直到类回调命中后才构造



我有一个Android类,它有一个来自异步HTTP进程的回调,以及一个带有许多状态代码的枚举:

public abstract class HttpPackage {
    public enum StatusCode {
        SUCCESS(0),
        NOT_FOUND(100),
        USERNAME_NOT_FOUND(101),
        AUTH_FAILED(110),
        SAVE_ERROR(111)
        //etc.
        private final int mCode;
        StatusCode(int i) {
            mCode = i;
            sByCode.put(i, this);
        }
    }
    private static final HashMap<Integer, StatusCode> sByCode = new HashMap<Integer, StatusCode>();
    //...
}

我发现 HttpPackage 类中的回调在enum构造之前被命中,这意味着当我尝试从静态代码图中提取状态代码时,它会返回 null,并且我的代码认为所有提要都失败了(当它们不是)。 为什么enum在回调命中后构造?

在Java中是懒惰加载的。如果您在加载 StatusCode 类之前访问映射,那么它当然会为空。

映射应该在枚举本身中。这样,如果您正在访问映射,则可以保证枚举类已加载,并且映射不为空。映射也应该对外部代码隐藏。应在枚举中提供静态StatusCode getByCode(int code)方法。

编辑:示例代码:

public enum StatusCode {
    SUCCESS(0),
    NOT_FOUND(100),
    USERNAME_NOT_FOUND(101),
    AUTH_FAILED(110),
    SAVE_ERROR(111);
    private final int code;
    private static final Map<Integer, StatusCode> map = new HashMap<Integer, StatusCode>();
    static {
        for (StatusCode sc : values()) {
            map.put(sc.getCode(), sc);
        }
    }
    StatusCode(int i) {
        this.code = i;
    }
    public static StatusCode getByCode(int code) {
        return map.get(code);
    }
    public int getCode() {
        return code;
    }
    public static void main(String[] args) {
        System.out.println(StatusCode.getByCode(111));
    }
}

或者,您也可以在构造函数中使用getMap()静态方法,如果映射为 null,则延迟初始化映射。

相关内容

  • 没有找到相关文章

最新更新