我需要类似以下的内容
enum EE {
A("anything"),
B("beta"),
...
Z("zulu"),
ALL,
;
EE(String s) {
this.s = s;
}
EE() {
String s = "";
for (EE ee : values()) { // PROBLEM HERE
if (ee != ALL) s += " " + ee.s;
}
this.s = s;
}
}
创建ALL
时,我想访问枚举的其他成员。由于values()
此时返回null
,上述操作无效。使用A
,B
,...,Z
显式无法编译。我完全理解为什么会发生鸡蛋问题,但我正在寻找一个很好的解决方法。
不,从ALL
删除EE
不是一种选择。
答案 0 :(得分:5)
这对你有用吗? :
enum EE {
A("anything"),
B("beta"),
...
Z("zulu"),
ALL,
;
String s = null;
EE(String s) {
this.s = s;
}
EE() {
}
private void initS() {
String s = "";
for (EE ee : values()) {
if (ee != ALL) s += " " + ee.s;
}
this.s = s;
}
public String getS() {
if ( this.s == null ) { // assume we are ALL and initialize
initS();
}
return this.s;
}
}
静态初始化程序可能更清晰。
public enum EE {
A("anything"),
B("beta"),
Z("zulu"),
ALL
;
static {
String s = "";
for (EE ee : values()) {
if ( ee != ALL ) s += ee + " ";
}
ALL.s = s.trim();
}
String s = null;
EE(String s) {
this.s = s;
}
EE() {
}
}
答案 1 :(得分:3)
你可以有一个静态StringBuilder,每个枚举常量将其值附加到构造函数中,然后在默认构造函数中将enum的字符串设置为StringBuilder的值。
但请注意,Java会阻止您直接从枚举构造函数中访问静态变量(理由充分!),因此您必须在另一个方法中执行脏工作,然后从构造函数中调用它。
为了实现这个目的,你必须确保最后宣布ALL
。
作为免责声明虽然这是一个真正可怕的解决方法,如果你可以,我鼓励你在这里探索其他可能性!
答案 2 :(得分:1)
最好的方法之一是使用enum polymorphism technique
:
public enum EE {
A("anything"), B("beta"), Z("zulu"), ALL {
@Override
public String getS() {
if (super.s == null) {
String s = "";
for (EE ee : values()) {
if (ee != ALL) {
s += " " + ee.s;
}
}
}
return s;
}
},
;
private String s;
EE(String s) {
this.s = s;
}
EE() {
this.s = null;
}
public String getS() {
return this.s;
}
}
测试类:
public class TestEE {
public static void main(String[] args) {
for (EE ee : EE.values()) {
System.out.println(ee.name() + ": " + ee.getS());
}
}
}
另见:
答案 3 :(得分:0)
为什么你不能全部删除?
考虑使用EnumSet,这将为您提供EE的任意组合。
import java.util.*;
enum EE {
A("anything"), B("beta"), Z("zulu");
EE(String s) {
this.s = s;
}
static Set<EE> all=EnumSet.allOf(EE.class);
final String s;
}