0

非同期HTTPプロセスからのコールバックを持つAndroidクラスと、次のようないくつかのステータスコードを持つ列挙型があります。

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 クラスがロードされる前にマップにアクセスすると、もちろん空になります。

マップは列挙型自体にある必要があります。このようにして、マップにアクセスしている場合、enum クラスが読み込まれ、マップが空でないことが保証されます。マップは、外部コードからも隠されている必要があります。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 の場合にマップを遅延初期化するコンストラクター内で静的メソッドを使用することもできます。

于 2012-06-19T17:17:08.643 に答える