0

我有一个 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会在回调被击中后构造?

4

1 回答 1

3

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()在构造函数中使用静态方法,如果地图为空,则延迟初始化地图。

于 2012-06-19T17:17:08.643 回答