gpt4 book ai didi

java - 具有不可变参数的自引用枚举

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:09:33 25 4
gpt4 key购买 nike

考虑以下 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;
}
}

这不会编译,因为 ZY 还没有被声明为 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;
}
}

这比第一个解决方案更粗暴,因为该字段不再是最终的,并且容易受到反射的影响。归根结底,这是一个晦涩难懂的担忧,但暗示了一种糟糕的代码味道。

有没有一种与第一个示例基本相同但可以正确编译的方法?

最佳答案

也许没有您想要的那么漂亮...

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());
}
}
}

关于java - 具有不可变参数的自引用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19429343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com