Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在另一个枚举的定义中迭代使用枚举_Java_Enums - Fatal编程技术网

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