Constant expression required一回switch結合Enumの使用を記す

2456 ワード

Constant expression required一回switch結合Enumの使用を記す
まず
  • switchのcaseは定数しか使用できず、コンパイル時に認識できる量です.
  • 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の報告が出てきてコードのEnum類を見てみましょう.
    public static enum Code implements KeeperException.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 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はいずれも確定した値である.コンパイルパス.