Альтернатива enum в 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
     }
 }

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

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

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


person Daniel Moura    schedule 24.06.2009    source источник
comment
Мне действительно любопытно: по каким причинам все еще используется Java 1.4?   -  person Konrad Rudolph    schedule 24.06.2009
comment
Предлагаю добавить этот факт (мобильный) в заголовок вопроса   -  person David Rabinowitz    schedule 24.06.2009
comment
Многие до сих пор используют 1.4, я не вижу в этом проблемы.   -  person Jim    schedule 08.02.2010


Ответы (4)


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

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

person Roland Schneider    schedule 24.06.2009
comment
Уважаемый Рональд, первая ссылка не работает. Не могли бы вы это исправить? Спасибо. - person RestInPeace; 27.11.2015
comment
Я заменил исходную ссылку на другую. Надеюсь, поможет. - person Roland Schneider; 28.11.2015
comment
Уважаемый Рональд, ссылка не работает. Не могли бы вы это исправить? Спасибо. - person dardy; 24.01.2017

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

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.

person Nick Holt    schedule 24.06.2009

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

person John Meagher    schedule 24.06.2009
comment
Ссылка неработающая, подправьте пожалуйста? - person Vladimir Ivanov; 22.03.2012

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

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

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

Вызывающий может использовать функцию как

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

    String sFormattedDate = getFormattedDate(format);

}

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

person bhavik shah    schedule 05.03.2013