Альтернатива enum в Java 1.4 - PullRequest
13 голосов
/ 24 июня 2009

Поскольку в 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
     }
 }

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

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

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

Ответы [ 4 ]

28 голосов
/ 24 июня 2009

Лучше всего использовать в pre 1.5 шаблон Typesafe Enum , лучше всего описанный в книге Effective Java by Josh Bloch . Однако он имеет некоторые ограничения, особенно когда вы имеете дело с различными загрузчиками классов, сериализацией и т. Д.

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

7 голосов
/ 24 июня 2009

Обычно я создаю то, что я называю постоянным классом, что-то вроде этого:

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.

6 голосов
/ 24 июня 2009

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

0 голосов
/ 05 марта 2013

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

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

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

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

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

Actual Enum

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;
}

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

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

    String sFormattedDate = getFormattedDate(format);

}

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

...