Инициализация множества констант последовательными целыми числами. C-подобное перечисление в Java?

#java

#java

Вопрос:

Мне нужно инициализировать около 10-12 констант последовательными целыми числами. Я делаю это в данный момент:

 class MyClass
{
    public static final int A = 1;
    public static final int B = 2;
    public static final int C = 3;
    public static final int D = 4;
    .
    .
    .
}
  

Просто интересно, есть ли более аккуратный способ сделать это. Может быть, что-то вроде enum в C?

Ответ №1:

Предпочтительный способ — использовать enum :

 enum MyEnum {
    A, B, C, D;
    public final int value = ordinal()   1; // or "  base index"
}

public static void main(String[] args) {
    System.out.println(MyEnum.B.value); // 2
}
  

Или, если вы действительно предпочитаете примитивные целочисленные константы, вы могли бы сделать:

 public static final int A, B, C, D;
static {
    int x = 1;
    A = x  ; B = x  ; C = x  ; D = x  ;
}
  

Это ограничивает область действия вспомогательной переменной счетчика ( x ).

Комментарии:

1. Разве этот конструктор не используется по умолчанию для значений? Зачем это реализовывать?

2. @Gene Martin: Нет, конструктор по умолчанию не инициализирует ни одно вызываемое поле value . И, кстати, я очистил ответ и вместо этого поместил присваивание в объявление.

Ответ №2:

Да, в Java есть перечисления начиная с 1.5. Или вы также могли бы сделать:

 private static int x = 0;

public static final int A = x  ;
public static final int B = x  ;
public static final int C = x  ;
public static final int D = x  ;
.
.
  

Комментарии:

1. Я полагаю, вы объявили D дважды.

2. взял на себя смелость исправить это.

Ответ №3:

Вы можете использовать enum в Java

 enum MyEnum {
   NOT_USED, A, B C, D, E, F
}

MyEnum x = 
int num = x.ordinal();
  

Ответ №4:

Да, вы можете использовать enum. Что-то вроде:

 class MyClass
{
public enum myEnum {
   A, B, C,D 
}

}
  

Ответ №5:

Перечисления в java работают иначе, чем перечисления в C. Вы могли бы сделать что-то вроде следующего, но тогда вам пришлось бы вызывать GetValue() каждый раз, когда вы хотели использовать константу, что может быть не совсем тем, что вам нужно.

 public enum MyEnum {
    A(1), B(2), C(3), D(4);

    private final int value;        

    private MyEnum(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}