我试图通过使用枚举而不是字符串数组来使我的代码对于其他开发人员来说更具可扩展性。我有:
public enum FOO {
A, B, C, D, E
}
和
public enum BAR {
Z, Y, X, W
}
在 FOO
中,我希望能够迭代地定义:
D, E, F(Z), F(Y), F(X), F(W)
因此,当我将项目添加到 BAR 时,它会自动将其添加到 FOO。我认为它必须是 FOO 中的一个方法,而 BAR 几乎肯定应该是一个内部类(因此是私有(private)的),但我不知道该怎么做。使用
for (BAR b : BAR.values()) {}
似乎至少是解决方案的一部分。 如果有帮助的话,为了上下文,我正在使用探路者角色扮演技能,并列出了每个技能:
public enum SkillsEnum {
ACROBATICS,
APPRAISE,
BLUFF,
CLIMB,
CRAFT,
DIPLOMACY,
DISABLE_DEVICE,
DISGUISE,
ESCAPE_ARTIST,
FLY,
HANDLE_ANIMAL,
HEAL,
INTIMIDATE,
KNOWLEDGE(KnowledgeList.values().[0])
KNOWLEDGE(KnowledgeList.values().[1]) etc
}
enum KnowledgeList {
ARCANA,
DUNGEONEERING,
ENGINEERING,
GEOGRAPHY,
HISTORY,
LOCAL,
NATURE,
NOBILITY,
PLANES,
RELIGION
}
最佳答案
枚举实例是通过类似 C 的语法神奇地创建的 public enum E { A, B, C }
并且您无法添加更多实例,即使它们在编译时已知。
根据您必须附加到每个枚举实例的逻辑量以及您拥有多少个不同的“子枚举”类别,您可以尝试以下方法之一:
带参数的单个枚举类
public enum Day {
MONDAY(false),
TUESDAY(false),
WEDNESDAY(false),
THURSDAY(false),
FRIDAY(false),
SATURDAY(true),
SUNDAY(true);
private final boolean weekend;
private Day(boolean weekend) {
this.weekend = weekend;
}
public boolean isWeekend() {
return weekend;
}
public void doSomething() {
if (isWeekend()) {
// have fun
} else {
// do some work
}
}
}
优点:这种方法允许您拥有单个枚举类(例如,您可以轻松地迭代所有实例),很简单,并且不添加样板。
缺点:如果您经常测试类别成员资格,您的代码将变得困惑 if
s;您不能在编译时强制变量引用特定类别的实例。
枚举实现接口(interface)
public interface Day {
public void doSomething();
}
public enum WorkDay implements Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY;
@Override
public void doSomething() {
// do some work
}
}
public enum WeekEnd implements Day {
SATURDAY,
SUNDAY;
@Override
public void doSomething() {
// have fun
}
}
优点:您可以对单个类别的实例进行类型安全引用;您可以在方法中隔离特定于类别的代码,从而减少成员资格测试的需要;无需修改原代码即可扩展。
缺点:需要一些样板文件(对于简单的情况可能太多);您不会获得自动生成的所有实例的集合。
请参阅此答案以获取 enums implementing interfaces 的更多示例.
关于java - 在另一个枚举的定义中迭代地使用一个枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15224294/