Подтвердить что ты не робот

Альтернатива перечислению в Java 1.4

Так как Java 1.4 не имеет перечислений, я делаю что-то вроде этого:

public class SomeClass {
     public static int SOME_VALUE_1 = 0;
     public static int SOME_VALUE_2 = 1;
     public static int SOME_VALUE_3 = 2;

     public void receiveSomeValue(int someValue) {
            // do something
     }
 }

Вызывающий getSomeValue должен передать один из трех значений, но он может передать любой другой int. Если это перечисление, вызывающий может передать только одно действительное значение.

Должно ли receiveSomeValue вызывать исключение InvalidValue?

Каковы хорошие альтернативы перечислениям Java 5?

4b9b3361

Ответ 1

Лучше всего использовать в pre 1.5 Typafe Enum Pattern, лучше всего описанный в книге Эффективная Java от Джоша Блоха. Однако он имеет некоторые ограничения, особенно когда вы имеете дело с разными загрузчиками классов, сериализации и т.д.

Вы также можете посмотреть проект Apache Commons Lang и особенно класс enum, как написал Джон. Это реализация этого шаблона и поддержка создания собственных перечислений.

Ответ 2

Я обычно создавал бы то, что я называю константным классом, например:

public class MyConstant 
{
  public static final MyConstant SOME_VALUE = new MyConstant(1);
  public static final MyConstant SOME_OTHER_VALUE = new MyConstant(2);
  ...

  private final int id;


  private MyConstant(int id)
  {
    this.id = id;
  }

  public boolean equal(Object object) 
  {
    ...
  }

  public int hashCode() 
  {
    ...
  }
}

где equals и hashCode используют id.

Ответ 3

Apache Commons Lang имеет класс Enum, который хорошо работает и хорошо охватывает то, что предлагает Java 5 Enums.

Ответ 4

Если база кода приложения будет использовать много перечислений, то я предпочел бы следующее решение, которое я использовал в своем приложении.

Базовый класс

public class Enum {
    protected int _enumValue;
    protected Enum(int enumValue) {
        this._enumValue = enumValue;
    }

    public int Value() {
        return this._enumValue;
    }
}

Затем ваши перечисления будут следовать этому шаблону

Фактическое перечисление

public class DATE_FORMAT extends Enum {
    public static final int DDMMYYYY = 1;
    public static final int MMDDYYYY = 2;
    public static final int YYYYMMDD = 3;

    public DATE_FORMAT(int enumValue) {
        super(enumValue);
    }
}

И ваш код может использовать это перечисление следующим образом

String getFormattedDate(DATE_FORMAT format) {

    String sDateFormatted = "";

    switch (format.Value()) {

        case DATE_FORMAT.DDMMYYYY : 
            break;
        case DATE_FORMAT.MMDDYYYY :
            break;
        case DATE_FORMAT.YYYYMMDD :
            break;
        default:
            break;
    }

    return sDateFormatted;
}

Caller может использовать функцию как

void callerAPI() {
    DATE_FORMAT format = new DATE_FORMAT(DATE_FORMAT.DDMMYYYY);

    String sFormattedDate = getFormattedDate(format);

}

Это еще не полное доказательство против инициализации полученных объектов Enum с любым целым значением. Однако он может обеспечить хорошее синтаксическое руководство для работы в среде, отличной от enum.