Constant expression required一回switch結合Enumの使用を記す
2456 ワード
Constant expression required一回switch結合Enumの使用を記す
まず switchのcaseは定数しか使用できず、コンパイル時に認識できる量です. Enumの使用 コードを見てください.これはzookeeperの使用を使用して通常の状態比較を行います.
この時
クラスで定義されたintValue()メソッドで対応するEnumのint値を取得できますが、これは明確ではありません(メソッドを実行してから対応する値を決定する必要があります).javaは、この値がコンパイル中に決定されるのではなく、実行中に決定されることを明確にする必要があります.
正しい使用方法は次のとおりです.
このとき,コンパイル中のcodeとOKはいずれも確定した値である.コンパイルパス.
まず
@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はいずれも確定した値である.コンパイルパス.