Java 如何改进此内部枚举代码?

Java 如何改进此内部枚举代码?,java,enums,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), Cons

我有这样的想法:

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;
 }
}
我有
标记
,所以我可以像这样传递给方法:
方法(Constants.SystemA)
方法(Constants.SystemB)


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

我将依靠一个类(工厂类)来创建和控制系统类的实例。

由于您是在代码中声明所有枚举,因此如果需要,您有责任提供不重叠的数字。
更有趣的问题是:你为什么需要这个?闻起来你好像在用枚举来处理它们不是为之设计的东西。

如果两个枚举的契约相同,你可以将其合并到一个枚举中。 但是,为了区分这两个系统,您可以有一个单独的“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;
    }

}
公共枚举系统类型{
A、 B;
公共集getSystems(){
Set systems=EnumSet.noneOf(System.class);
对于(系统:System.values()){
if(system.getType()==此){
系统。添加(系统);
}
}
//您还可以存储此结果
//作为缓存的实例变量。
返回系统;
}
}
公共枚举系统{
康斯通(系统类型A),
常数2(系统类型A),
常数三(系统类型A),
ConstFour(系统类型B),
ConstantFive(系统类型B);
私有最终系统类型系统类型;
专用系统(最终系统类型系统类型){
this.systemType=systemType;
}
public int getNumber(){
返回序号()+1;
}
公共系统类型getType(){
返回系统类型;
}
}
如果您真的需要为不同的系统类型定义不同的契约(只对SystemX或其他有意义的方法),那么这当然是无用的

附言:
当然,
System
确实是个坏名字,因为它隐藏了
java.lang.System
类。

欢迎使用StackOverflow。在右边,当你问你的问题时,有一个方便的格式框。值得一读,如问题区域上方的[?]所示。人们非常愿意帮助你,但是通过做一些简单的事情(比如格式化)来帮助他们。为什么他们需要两个独立的类?我想你会对此感兴趣的。如果是这样,请表示您的支持并帮助它进入测试版。快到了,T.J.克劳德,谢谢。看起来已经有人格式化了。你是说SystemA和SystemB吗?每个选项的值都来自不同的客户端选项。在代码中,我想看到SystemA.ConstOne和SystemB.ConstFour。工厂类是什么意思?它们是枚举。我把它们放在一个类中,因为我希望所有这些枚举都放在一个地方,我已经指定了为什么需要这个。我需要能够拥有enum常量,但我希望将它们划分为类别并进行访问。我可以简单地使用不同的枚举,但我也希望将它们都传递给一个方法来处理它们。我可以通过标记接口解决这个问题。问题是我以什么方式无意中使用它们。请澄清。您将合同(非重叠数字)强加给多个枚举,这不完全是标准用法。因为Java不支持继承枚举,所以使用它可能是错误的特性,使用标准抽象基类和各种子类可能会更好。回答枚举问题:既然您已经有了一个公共接口,只需将它们粘贴到集合或映射中即可