请考虑以下 sscce
public enum Flippable
A (Z), B (Y), Y (B), Z (A);
private final Flippable opposite;
private Flippable(Flippable opposite) {
this.opposite = opposite;
}
public Flippable flip() {
return opposite;
}
}
这段代码无法编译,因为Z
和Y
还未被声明可以成为A
和B
构造函数的参数。
潜在解决方案1:硬编码方法
public enum Flippable {
A {
public Flippable flip() { return Z; }
}, B {
public Flippable flip() { return Y; }
}, Y {
public Flippable flip() { return B; }
}, Z {
public Flippable flip() { return A; }
};
public abstract Flippable flip();
}
虽然这很实用,但风格上看起来相当糟糕。尽管我无法确切指出为什么这会是一个真正的问题。
潜在解决方案 2: 静态加载
public enum Flippable {
A, B, Y, Z;
private Flippable opposite;
static {
for(Flippable f : Flippable.values()) {
switch(f) {
case A:
f.opposite = Z;
break;
case B:
f.opposite = Y;
break;
case Y:
f.opposite = B;
break;
case Z:
f.opposite = A;
break;
}
}
}
public Flippable flip() {
return opposite;
}
}
这个解决方案比第一种方案更加糟糕,因为这个字段不再是final,并且容易被反射攻击。虽然这个问题很少见,但是表明了代码存在潜在的问题。
有没有一种与第一个示例基本相同但可以正确编译的方法?
case:
表达式中都必须这样做,为什么不直接依次分配每个呢? - robert