как можно улучшить этот внутренний enum-код? - PullRequest
2 голосов
/ 18 января 2011

У меня есть эта конструкция:

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 ]

3 голосов
/ 18 января 2011

Если контракт двух перечислений один и тот же, вы можете поместить его в одно перечисление. Однако, чтобы различать две системы, у вас может быть отдельное перечисление 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.

1 голос
/ 18 января 2011

Поскольку вы объявляете все перечисления в коде, вы обязаны предоставлять непересекающиеся числа, если вам это нужно. Более интересный вопрос: зачем вам это? Пахнет, как будто вы используете перечисления для вещей, для которых они не предназначены.

0 голосов
/ 18 января 2011

Я бы положился на один класс - класс фабрика - для создания и управления экземплярами классов вашей системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...