如何改进这个内部枚举代码?

时间:2011-01-17 23:51:30

标签: java enums

我有这个结构:

public class Constants {
 enum SystemA implements Marker {
    ConstOne(1), ConstTwo(2), ConstThree(3);
    SystemA(int i)
   {
      number = i;
   }
   int number;
 }

  enum SystemB implements Marker {
    ConstFour(4), ConstFive(5), ConstSix(6);
  SystemB(int i)
   {
      number =i;
   } 
   int number;
 }
}

我有Marker所以我可以传递给这样的方法: method(Constants.SystemA)method(Constants.SystemB)

列出所有枚举值的最佳方法是什么?我还想确保它不会重复任何枚举中的数字。

3 个答案:

答案 0 :(得分:3)

如果两个枚举的合约相同,您可以将其合并为一个枚举。 但是,为了区分这两个系统,您可以使用单独的“SystemType”枚举,其中包含A,B,...并且您可以为系统枚举中的每个常量指定一个SystemType。

此外,您的SystemType枚举可以提供一个实例方法,该方法将返回给定类型的所有系统,以便您可以根据需要仅迭代该子集。

至于编号,如果序列像你的例子一样简单,你可以使用枚举常量的ordinal()方法,这样你就可以简单地依赖于常量声明顺序(也许用一些数学添加)。这就是我的意思:

public enum SystemType {
    A, B;

    public Set<System> getSystems() {
        Set<System> systems = EnumSet.noneOf(System.class);
        for (System system : System.values()) {
            if (system.getType() == this) {
                systems.add(system);
            }
        }
        // you could also store this result
        // as an instance variable for caching.
        return systems; 
    }
}

public enum System {
    ConstOne(SystemType.A),
    ConstTwo(SystemType.A),
    ConstThree(SystemType.A),
    ConstFour(SystemType.B),
    ConstantFive(SystemType.B);

    private final SystemType systemType;

    private System(final SystemType systemType) {
        this.systemType = systemType;
    }

    public int getNumber() {
        return ordinal() + 1;
    }

    public SystemType getType() {
        return systemType;
    }

}

如果您确实需要为不同的系统类型定义不同的合同(对SystemX或其他任何方法都有意义的方法),这当然没用。

P.S .: 当然,System是一个非常糟糕的名称,因为它隐藏了java.lang.System类。

答案 1 :(得分:1)

由于您要在代码中声明所有枚举,因此如果您需要,您有责任提供不重叠的数字。 更有趣的问题是:你为什么需要这个?它闻起来就像你正在使用enum来制作它们不适合的东西。

答案 2 :(得分:0)

我将依赖一个类 - factory 类 - 来创建和控制System类的实例。