2

我试图通过使用枚举而不是字符串数组来使我的代码对其他开发人员更具可扩展性。我有:

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 几乎可以肯定是一个内部类(因此是私有的),但我不知道该怎么做。使用

for (BAR b : BAR.values()) {}

似乎至少是解决方案的一部分。如果有帮助,对于上下文,我正在使用 Pathfinder 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
}
4

3 回答 3

1

关于将项目添加到BAR. Java 中的枚举是一组预定义的常量,您应该在编译时知道它们的值。首先不可能将项目添加到 ENUM。希望我已经正确解释了您的问题。

于 2013-03-05T13:05:05.740 回答
1

枚举实例是由类似 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;您不能在编译时强制变量引用特定类别的实例。

实现接口的枚举

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
    }
}

优点:您可以对单个类别的实例进行类型安全的引用;您可以在方法中隔离特定类别的代码,减少成员资格测试的需要;可以在不修改原始代码的情况下进行扩展。

缺点:需要一些样板文件(对于简单的情况可能太多了);您不会获得所有实例的自动生成集合。

有关枚举实现接口的更多示例,请参见此答案。

于 2013-03-05T23:06:56.617 回答
0

我没有看到将值动态添加到枚举的方法。它的设计使得所有值在编译时都是已知的。

作为替代方案,考虑自己实现枚举(使用类型安全枚举设计模式)。例如,“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();
}
于 2013-03-05T13:10:29.680 回答