Чи можу я встановити значення запуску enum на Java?


194

Я використовую enum, щоб зробити кілька констант:

enum ids {OPEN, CLOSE};

значення OPEN дорівнює нулю, але я хочу його як 100. Це можливо?


@ScottF Ви хочете, як використовувати переписки?
Аніш Б.

У верхній відповіді є визначення перерахунку. Я хотів би приклад того, як цей визначений enum буде використовуватися в коді. Наприклад, як би визначений ctor використовувався для створення екземпляра enum із конкретним цілим значенням.
ScottF

@ScottF, якби я був ти, замість того, щоб встановлювати щедрість на цій посаді, я краще поставив би зовсім нове запитання ..... або прочитав документацію про переліків. Здається, вам потрібно зрозуміти деякі основні знання про це;)
lealceldeiro

enum ids {OPEN = 100, CLOSE};?
Пан Оскар

Відповіді:


307

Перерахунки Java не схожі на C або C ++ перерахунки, які насправді є лише мітками для цілих чисел.

Переліки Java реалізуються більше, як класи - і вони навіть можуть мати декілька атрибутів.

public enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

Велика різниця полягає в тому, що вони безпечні для типу, що означає, що вам не потрібно турбуватися про присвоєння переліку COLOR змінній SIZE.

Див. Http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html для отримання додаткової інформації.


Виходячи з вашої заяви, найкращою практикою використання Java для створення переліку послідовних цілих чисел (подібних до переліку C ++), для індексу в масив чи щось таке слід було б написати: enum Ids {NAME (0), AGE (1 ), ВИСОК (2), ВЕС (3); } Дякую, -bn
bn.

Можливо, і особливо, якщо ви коли-небудь десь серіалізуєте цілісні значення.
lavinio

1
ви можете, будь ласка, розповісти, як використовувати цей перелік у функції?
Помилки трапляються

2
Ліниво, що стандарти Java не дозволяють встановлювати значення для перерахунку. Принаймні, c # дозволяє це ТА є безпечним для типу.
csmith

2
FWIW, C ++ 11 тепер має безпечний тип enum class.
фенікс

93

Так. Ви можете передати числові значення конструктору для enum, наприклад:

enum Ids {
  OPEN(100),
  CLOSE(200);

  private int value;    

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

  public int getValue() {
    return value;
  }
}

Додаткову інформацію див. У посібнику з мови Sun Sun.


Класно. Чи можна змішувати? Тобто присвоювати числа лише вибраним значенням Enum.
Фредерік Норд

приватний модифікатор зайвий для конструкторів перерахунків
Nino van Hooff

@FrederickNord - Звичайно. Просто додайте другий приватний конструктор без аргументів, який ініціалізується valueдо нуля (скажімо). Потім включіть (скажіть) DANCEу список значень.
Стівен С

15

Що використовувати цей спосіб:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public int getColorValue() {
              switch (this) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }
}

існує лише один метод ..

ви можете використовувати статичний метод і передавати Enum як такий параметр, як:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public static int getColorValue(HL_COLORS hl) {
              switch (hl) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }

Зауважте, що ці два способи використовують менше пам'яті та більше процесорних одиниць. Я не кажу, що це найкращий спосіб, але це просто інший підхід.


1
Чому getColorValue()синхронізується у другому прикладі?
josaphatv

@josaphatv Вся функціональність у другому прикладі статична, вона ніколи не змінюється. Можливо, ви хочете, щоб HL_COLORS.getColorValue(HL_COLORS.YELLOW);не ініціалізувати перерахунок.
мазунки

11

Якщо ви використовуєте дуже великі типи перерахунків, наступне може бути корисним;

public enum deneme {

    UPDATE, UPDATE_FAILED;

    private static Map<Integer, deneme> ss = new TreeMap<Integer,deneme>();
    private static final int START_VALUE = 100;
    private int value;

    static {
        for(int i=0;i<values().length;i++)
        {
            values()[i].value = START_VALUE + i;
            ss.put(values()[i].value, values()[i]);
        }
    }

    public static deneme fromInt(int i) {
        return ss.get(i);
    }

    public int value() {
    return value;
    }
}

7

Якщо ви хочете емулювати перерахунок C / C ++ (базовий номер та додаткові додатки):

enum ids {
    OPEN, CLOSE;
    //
    private static final int BASE_ORDINAL = 100;
    public int getCode() {
        return ordinal() + BASE_ORDINAL;
    }
};

public class TestEnum {
    public static void main (String... args){
        for (ids i : new ids[] { ids.OPEN, ids.CLOSE }) {
            System.out.println(i.toString() + " " + 
                i.ordinal() + " " + 
                i.getCode());
        }
    }
}
OPEN 0 100
CLOSE 1 101

4

Функція ordinal () повертає відносне положення ідентифікатора в enum. Ви можете використовувати це для автоматичного індексування зі зміщенням, як при перерахунку в стилі С.

Приклад:

public class TestEnum {
    enum ids {
        OPEN,
        CLOSE,
        OTHER;

        public final int value = 100 + ordinal();
    };

    public static void main(String arg[]) {
        System.out.println("OPEN:  " + ids.OPEN.value);
        System.out.println("CLOSE: " + ids.CLOSE.value);
        System.out.println("OTHER: " + ids.OTHER.value);
    }
};

Дає вихід:

OPEN:  100
CLOSE: 101
OTHER: 102

Редагувати: щойно зрозумів, що це дуже схоже на відповідь грандів , але я залишу його тут, оскільки він дуже чистий і приблизно такий близький, як можна дістатися до переліку стилю C.


У прикладі ви берете перерахунок і отримуєте int. Чи можете ви показати зворотну сторону, взяти int і закінчити перелік (без явного випадку перемикання для кожного значення?)
ScottF

Щодо питання, я вважаю, що це найбільш відповідна відповідь. Тут ми змінили індекс за замовчуванням enum, починаючи з 100, не визначаючи нову змінну та не призначаючи їх через конструктор.
Рахул Джайн

@RahulJain Я скоріше використовую прийняту відповідь. Мені це здається чистішим.
lealceldeiro

1

@scottf

Перерахунок схожий на Сінглтона. JVM створює екземпляр.

Якби ви створили його самостійно за допомогою класів, це могло б виглядати так

public static class MyEnum {

    final public static MyEnum ONE;
    final public static MyEnum TWO;

    static {
        ONE = new MyEnum("1");
        TWO = new MyEnum("2");
    }

    final String enumValue;

    private MyEnum(String value){
        enumValue = value;    
    }

    @Override
    public String toString(){
        return enumValue;
    }


}

І може використовуватися так:

public class HelloWorld{

   public static class MyEnum {

       final public static MyEnum ONE;
       final public static MyEnum TWO;

       static {
          ONE = new MyEnum("1");
          TWO = new MyEnum("2");
       }

       final String enumValue;

       private MyEnum(String value){
           enumValue = value;    
       }

       @Override
       public String toString(){
           return enumValue;
       }


   }

    public static void main(String []args){

       System.out.println(MyEnum.ONE);
       System.out.println(MyEnum.TWO);

       System.out.println(MyEnum.ONE == MyEnum.ONE);

       System.out.println("Hello World");
    }
}

0
 public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     System.out.println(id1.getValue());
    }
}

enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

@scottf, Ви, мабуть, заплуталися через конструктор, визначений в ENUM.

Дозвольте мені пояснити це.

Коли клас class loaderнавантажень enum, то enumконструктор також викликається. Про те, що!! Так, це називається OPENі close. З якими значеннями 100для OPENі 200дляclose

Чи можу я мати різну цінність?

так,

public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     id1.setValue(2);
     System.out.println(id1.getValue());
    }
}

enum Ids {
    OPEN(100), CLOSE(200);

    private int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
    public void setValue(int value) { id = value; }
}

Але це погана практика. enumвикористовується для представлення constantsподібних days of week, colors in rainbowтобто такої невеликої групи заздалегідь визначених констант.


0

Я думаю, що ви розгублені в перегляді переліків C ++. Перевідники Java різні.

Це буде код, якщо ви звикли до переліку C / C ++:

public class TestEnum {
enum ids {
    OPEN,
    CLOSE,
    OTHER;

    public final int value = 100 + ordinal();
};

public static void main(String arg[]) {
    System.out.println("OPEN:  " + ids.OPEN.value);
    System.out.println("CLOSE: " + ids.CLOSE.value);
    System.out.println("OTHER: " + ids.OTHER.value);
}
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.