Если контракт двух перечислений один и тот же, вы можете поместить его в одно перечисление.
Однако, чтобы различать две системы, у вас может быть отдельное перечисление SystemType, которое будет содержать A, B, ..., и вы можете назначить SystemType каждой константе в вашем перечислении System.
Кроме того, ваше перечисление SystemType может предоставить метод экземпляра, который будет возвращать все системы для данного типа, так что вы можете перебирать только это подмножество при необходимости.
Что касается нумерации, если последовательность так же проста, как в вашем примере, вы можете использовать метод ordinal () констант enum, чтобы вы просто полагались на порядок объявления констант (возможно, с некоторой математикой). добавлено). Вот что я имею в виду:
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
.