具有不可变参数的自引用枚举 [英] Self referential enum with immutable parameters
本文介绍了具有不可变参数的自引用枚举的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
请考虑以下 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;
}
}
这不会编译,因为<$ c $没有声明允许c> Z 和 Y
作为 A
和 B
的构造函数。
This doesn't compile, because Z
and Y
haven't been declared to be allowed to be arguments of A
and B
's constructor.
可能的解决方案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();
}
虽然功能正常,但从样式上看,它似乎很粗糙。尽管我无法确定为什么这将是一个真正的问题。
While functional, this seems stylistically quite gross. Though I can't put a finger on why this would be a real problem.
潜在的解决方案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;
}
}
这个领域不再是最终的,并且容易被反思。最终,这是一个令人费解的担忧,但会暗示一种不良的代码气味。
This is even more gross than the first solution, as the field is no longer final, and is vulnerable to reflection. Ultimately that is an obscure worry, but suggests a bad code smell.
有没有一种方法可以与第一个示例基本相同,但是
推荐答案
也许不是您想要的那样漂亮……
Again perhaps not as pretty as you were looking for ...
public enum Flippable {
A, B, Z, Y;
static {
A.opposite = Z;
B.opposite = Y;
Y.opposite = B;
Z.opposite = A;
}
public Flippable flip() {
return opposite;
}
private Flippable opposite;
public static void main(String[] args) {
for(Flippable f : Flippable.values()) {
System.out.println(f + " flips to " + f.flip());
}
}
}
这篇关于具有不可变参数的自引用枚举的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文