Вы смешиваете перечисления, которые определяют константы и связанные данные. Причина, по которой вы хотите определить «абстрактное перечисление», заключается в том, что существует только один набор констант, поэтому фактический вывод заключается в том, что должен быть только один enum
.
, в то время как типы enum
позволяютЧтобы напрямую хранить связанные данные, вы должны использовать эту функцию только для канонических ассоциаций. Когда, как и в вашем случае, существуют разные наборы связанных данных, вы не должны хранить их в типе enum
, так как это допускает только однозначные отношения. Кроме того, вместо создания другого избыточного типа enum
, определяющего идентичные константы, сохраните данные в EnumMap
, который специально предназначен для связывания данных с enum
константами.
Определение простого типа enum
как
public enum YourActualEnum {
STATUS_ONE,
STATUS_TWO
}
и класс, имеющий различные связанные данные, в зависимости от варианта использования:
public class StatusUpdater {
private static final EnumMap<YourActualEnum,String> CASE1, CASE2, CASE3;
static {
CASE1 = new EnumMap<>(YourActualEnum.class);
CASE1.put(YourActualEnum.STATUS_ONE, "one");
CASE1.put(YourActualEnum.STATUS_TWO, "two");
CASE2 = new EnumMap<>(YourActualEnum.class);
CASE2.put(YourActualEnum.STATUS_ONE, "oneTwo");
CASE2.put(YourActualEnum.STATUS_TWO, "twoTwo");
CASE3 = new EnumMap<>(YourActualEnum.class);
CASE3.put(YourActualEnum.STATUS_ONE, "oneThree");
CASE3.put(YourActualEnum.STATUS_TWO, "twoThree");
}
public void foo(boolean one, boolean two, boolean three, YourActualEnum status) {
if (one) {
caseOne(status, CASE1);
}
if (two) {
caseTwo(status, CASE2);
}
if (three) {
caseThree(status, CASE3);
}
}
private void caseOne(YourActualEnum status, EnumMap<YourActualEnum,String> m) {
m.get(status);
}
private void caseTwo(YourActualEnum status, EnumMap<YourActualEnum,String> m) {
m.get(status);
}
private void caseThree(YourActualEnum status, EnumMap<YourActualEnum,String> m) {
m.get(status);
}
}