1. ホーム
  2. java

Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式

2022-02-11 23:47:58
<パス

Enumとswitchの組み合わせで一度だけ定数表現が必要なことを記憶している。

最初の

  • switchの場合、定数、コンパイル時に認識される量しか使用できない。
  • Enumの使用

zookeeperの使い方を利用して、通常の状態比較をしているコードを見てみましょう。

@Override
    public void processResult(int rc, String s, Object o, Stat stat) {
        boolean exists;
        switch (rc) {
            case KeeperException.Code.OK.intValue:
                exists = true;
                break;
         ...
        }
  }


今回は Constant expression required エラー
CodeのEnumクラスを見てみましょう。

public static enum Code implements KeeperException.CodeDeprecated {
        CodeDeprecated { OK(0),
        SYSTEMERROR(-1),
        RUNTIMEINCONSISTENCY(-2),
        DATAINCONSISTENCY(-3),
        CONNECTIONLOSS(-4),
        MARSHALLINGERROR(-5),
        UNIMPLEMENTED(-6),
        OPERATIONTIMEOUT(-7),
        BADARGUMENTS(-8),
        APIERROR(-100),
        NONODE(-101),
        NOAUTH(-102),
        BADVERSION(-103),
        NOCHILDRENFOREPHEMERALS(-108),
        NODEEXISTS(-110),
        NOTEMPTY(-111),
        SESSIONEXPIRED(-112),
        INVALIDCALLBACK(-113),
        INVALIDACL(-114),
        AUTHFAILED(-115),
        SESSIONMOVED(-118),
        NOTREADONLY(-119);

        private static final Map<Integer, KeeperException.Code> lookup = new HashMap();
        private final int code;

        private Code(int code) {
            this.code = code;
        }

        public int intValue() {
            return this.code;
        }

        public static KeeperException.Code get(int code) {
            return (KeeperException.Code)lookup.get(code);
        }

        static {
            Iterator i$ = EnumSet.allOf(KeeperException.Code.class).iterator();

            while(i$.hasNext()) {
                KeeperException.Code c = (KeeperException.Code)i$.next();
                lookup.put(c.code, c);
            }

        }


クラスで定義された intValue() メソッドを経由して対応する Enum の int 値を取得することはできますが、これは明示的ではなく(対応する値を決定するためにメソッドを実行する必要がある)、java は実行時ではなくコンパイル時に値を決定できることを明確にする必要があります。

というのが正しい使い方であるはずです。

@Override
    public void processResult(int rc, String s, Object o, Stat stat) {
        boolean exists;
        KeeperException.Code code = KeeperException.Code.get(rc);
        switch (code) {
            case KeeperException.Code.OK:
                exists = true;
                break;
           ...
        }
 }


この時点では、codeもOKもコンパイル時の確定値です。コンパイルは成功です。