我有这个结构:
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)
列出所有枚举值的最佳方法是什么?我还想确保它不会重复任何枚举中的数字。
答案 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类的实例。