Java 在另一个枚举的定义中迭代使用枚举
我试图通过使用枚举而不是字符串数组,使我的代码对其他开发人员更具可扩展性。我有:Java 在另一个枚举的定义中迭代使用枚举,java,enums,Java,Enums,我试图通过使用枚举而不是字符串数组,使我的代码对其他开发人员更具可扩展性。我有: public enum FOO { A, B, C, D, E } 及 在FOO中,我希望能够迭代定义: D, E, F(Z), F(Y), F(X), F(W) 所以,当我将项目添加到BAR时,它会自动将其添加到FOO。我认为它必须是FOO中的一个方法,BAR几乎肯定应该是一个内部类(因此是私有的),但我不知道如何做到这一点。使用 for (BAR b : BAR.values()) {} 似乎至少是
public enum FOO {
A, B, C, D, E
}
及
在FOO
中,我希望能够迭代定义:
D, E, F(Z), F(Y), F(X), F(W)
所以,当我将项目添加到BAR时,它会自动将其添加到FOO。我认为它必须是FOO中的一个方法,BAR几乎肯定应该是一个内部类(因此是私有的),但我不知道如何做到这一点。使用
for (BAR b : BAR.values()) {}
似乎至少是解决方案的一部分。
如果有帮助的话,作为背景,我正在使用探路者RPG技能,并列出每项技能:
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
}
关于将项目添加到
栏
。在Java中,是一组预定义的常量,您应该在编译时知道它们的值。无法首先将项添加到枚举。希望我正确地解释了您的问题。我看不到向枚举动态添加值的方法。它的设计使得所有的值在编译时都是已知的
作为一种选择,考虑自己实现枚举(使用类型安全枚举设计模式)。例如,“enum”B从“enum”A扩展而来,并继承其所有值:
public class MyEnumA {
private MyEnumA() {
}
public static MyEnumA a1 = new MyEnumA();
public static MyEnumA a2 = new MyEnumA();
public static MyEnumA a3 = new MyEnumA();
}
public class MyEnumB extends MyEnumA {
private MyEnumB() {
super();
}
public static MyEnumB b1 = new MyEnumB();
public static MyEnumB b2 = new MyEnumB();
public static MyEnumB b3 = new MyEnumB();
}
枚举实例是通过类似C的语法
public Enum E{A,B,C}
神奇地创建的,您不能添加更多的实例,即使它们在编译时是已知的
根据您必须附加到每个枚举实例的逻辑量以及您有多少不同的“子枚举”类别,您可以尝试以下方法之一:
带参数的单个枚举类
公共枚举日{
星期一(假),
星期二(假),
星期三(假),
星期四(假),
星期五(假),
星期六(真的),
星期日(真);
私人周末;
私人日(周末){
这个周末=周末;
}
公共周末{
周末返回;
}
公共无效剂量测定法(){
if(isWeekend()){
//玩得开心
}否则{
//做些工作
}
}
}
优点:这种方法允许您拥有一个单一的枚举类(例如,您可以轻松地在所有实例上进行迭代),非常简单,并且不添加样板文件
缺点:如果你经常测试类别成员资格,你的代码将变得杂乱无章;不能在编译时强制变量引用特定类别的实例
枚举实现接口
公共接口日{
公共无效剂量();
}
公共枚举工作日实施日{
星期一,
星期二,
星期三,
星期四,
星期五;
@凌驾
公共无效剂量测定法(){
//做些工作
}
}
公众枚举周末实施日{
星期六,
星期日;
@凌驾
公共无效剂量测定法(){
//玩得开心
}
}
优点:可以对单个类别的实例进行类型安全引用;您可以在方法中隔离特定于类别的代码,减少成员资格测试的需要;可以在不修改原始代码的情况下进行扩展
缺点:需要一些样板(对于简单的案例可能太多);不会自动生成所有实例的集合
有关更多示例,请参见此答案。我的意思是为其他开发人员“修改”我的软件预编译。我会更新这个问题你必须有多重知识技能吗?不能有1个字段具有列表值。因此,当你添加一个新的知识列表时,你会将其添加到知识列表中。为什么你需要一个单独的知识枚举,而不是将
知识\u ARCANA
,知识\u地下城
等等添加到主技能列表中?我想这是一个备用选项,我只是想既然所有的知识都是按照相同的规则运行的,那将是一个很好的“代码重用”情况。你为什么试图破坏我在这个问题上的答案?我不太欣赏您的代码。@HovercraftFullOfEels您的代码正是我想要的,所以我将它添加到我的应用程序中。我发现你不能完全删除数字,它不会让你删除第一个数字。它这样做的原因是因为一个空文本框将无法通过测试,因为“Integer.parseInt(“”)抛出numberFormatException,因此无法删除最后一个字符。我本来会添加一条评论,但我想我还需要两个代表。我认为一个空文本框不是一个bug,所以提交了编辑供您审阅,我想我已经解释过了。对不起,如果我没抓住要点。
public class MyEnumA {
private MyEnumA() {
}
public static MyEnumA a1 = new MyEnumA();
public static MyEnumA a2 = new MyEnumA();
public static MyEnumA a3 = new MyEnumA();
}
public class MyEnumB extends MyEnumA {
private MyEnumB() {
super();
}
public static MyEnumB b1 = new MyEnumB();
public static MyEnumB b2 = new MyEnumB();
public static MyEnumB b3 = new MyEnumB();
}