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

Java Enum return Int

У меня возникли проблемы с объявлением перечисления. То, что я пытаюсь создать, представляет собой перечисление для "DownloadType", где есть три типа загрузки (AUDIO, VIDEO, AUDIO_AND_VIDEO).

Я внедрил код следующим образом:

private enum DownloadType {
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2);
    private final int value;

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

Это отлично работает, если я использую его следующим образом:

DownloadType.AUDIO_AND_VIDEO.value;

Однако, мне бы хотелось, чтобы мне не нужно было запрашивать значение. Возможно, я ошибаюсь, но это так, как некоторые классы работают на Java, такие как Font, например, чтобы установить стиль шрифта, вы используете:

Font.PLAIN

Что возвращает значение int, мы не используем:

Font.PLAIN.value
4b9b3361

Ответ 1

Font.PLAIN не является перечислением. Это просто int. Если вам нужно извлечь значение из перечисления, вы не можете избежать вызова метода или использования .value, потому что перечисления на самом деле являются объектами своего собственного типа, а не примитивами.

Если вам действительно нужен только int, и вы уже согласны с тем, что безопасность типов потеряна, пользователь может передать недопустимые значения в ваш API, вы можете также определить эти константы как int:

public final class DownloadType {
    public static final int AUDIO = 0;
    public static final int VIDEO = 1;
    public static final int AUDIO_AND_VIDEO = 2;

    // If you have only static members and want to simulate a static
    // class in Java, then you can make the constructor private.
    private DownloadType() {}
}

Кстати, поле value самом деле является избыточным, потому что есть также метод .ordinal(), так что вы можете определить enum как:

enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }

и получить "значение", используя

DownloadType.AUDIO_AND_VIDEO.ordinal()

Редактировать: исправил код.. static class не разрешен в Java. Посмотрите этот SO-ответ с объяснением и подробностями о том, как определять статические классы в Java.

Ответ 2

Если вам нужно получить значение int, просто получите getter для значения в ENUM:

private enum DownloadType {
    AUDIO(1), VIDEO(2), AUDIO_AND_VIDEO(3);
    private final int value;

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

    public int getValue() {
        return value;
    }
}

public static void main(String[] args) {
    System.out.println(DownloadType.AUDIO.getValue());           //returns 1
    System.out.println(DownloadType.VIDEO.getValue());           //returns 2
    System.out.println(DownloadType.AUDIO_AND_VIDEO.getValue()); //returns 3
}

Или вы могли бы просто использовать метод ordinal(), который возвратил бы положение константы перечисления в перечисление.

private enum DownloadType {
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2);
    //rest of the code
}

System.out.println(DownloadType.AUDIO.ordinal());            //returns 0
System.out.println(DownloadType.VIDEO.ordinal());            //returns 1
System.out.println(DownloadType.AUDIO_AND_VIDEO.ordinal()); //returns 2

Ответ 3

Сначала вы должны задать себе следующий вопрос: вам действительно нужен int?

Цель перечислений состоит в том, чтобы иметь коллекцию элементов (констант), которые имеют значение в коде, не полагаясь на внешнее значение (например, int). Перечисления в Java могут использоваться в качестве аргумента для параметров переключения, и их можно безопасно сравнивать с помощью оператора равенства "==" (среди прочих).

Предложение 1 (без необходимости):

Часто нет необходимости в целом числе, просто используйте это:

private enum DownloadType{
    AUDIO, VIDEO, AUDIO_AND_VIDEO
}

Использование:

DownloadType downloadType = MyObj.getDownloadType();
if (downloadType == DownloadType.AUDIO) {
    //...
}
//or
switch (downloadType) {
  case AUDIO:  //...
          break;
  case VIDEO: //...
          break;
  case AUDIO_AND_VIDEO: //...
          break;
}

Предложение 2 (необходимо):

Тем не менее, иногда может быть полезно преобразовать enum в int (например, если внешний API ожидает значения int). В этом случае я бы посоветовал пометить методы как методы преобразования, используя toXxx() -Style. Для печати переопределите toString().

private enum DownloadType {
    AUDIO(2), VIDEO(5), AUDIO_AND_VIDEO(11);
    private final int code;

    private DownloadType(int code) {
        this.code = code;
    }

    public int toInt() {
        return code;
    }

    public String toString() {
        //only override toString, if the returned value has a meaning for the
        //human viewing this value 
        return String.valueOf(code);
    }
}

System.out.println(DownloadType.AUDIO.toInt());           //returns 2
System.out.println(DownloadType.AUDIO);                   //returns 2 via 'toString/code'
System.out.println(DownloadType.AUDIO).ordinal();         //returns 0
System.out.println(DownloadType.AUDIO.name());            //returns AUDIO
System.out.println(DownloadType.VIDEO.toInt());           //returns 5
System.out.println(DownloadType.VIDEO.ordinal());         //returns 1
System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 11

Резюме

  • Не используйте Integer вместе с enum, если это не нужно.
  • Не полагайтесь на использование ordinal() для получения целого числа перечисления, потому что это значение может измениться, если вы измените порядок (например, вставив значение). Если вы планируете использовать ordinal() возможно, лучше использовать предложение 1.
  • Обычно не используйте int-константы вместо перечислений (как в принятом ответе), потому что вы потеряете безопасность типов.

Ответ 4

Просто вызовите метод ordinal() для значения перечисления, чтобы получить его соответствующее число. Нет необходимости объявлять атрибут добавления с его значением, каждое перечислимое значение получает свой собственный номер по умолчанию, назначается начиная с нуля, увеличиваясь на единицу для каждого значения в том же порядке, в котором они были объявлены.

Вы не должны зависеть от значения int enum, только от его фактического значения. Перечисления на Java - это другой тип монстра и не похожи на перечисления в C, где вы зависите от их целочисленного кода.

Относительно примера, предоставленного вами в вопросе, Font.PLAIN работает, потому что это просто целочисленная константа класса Font. Если вам абсолютно необходим (возможно, изменяющийся) цифровой код, то enum не является правильным инструментом для задания, лучше придерживаться числовых констант.

Ответ 5

Вы можете попробовать этот код.

private enum DownloadType {
    AUDIO , VIDEO , AUDIO_AND_VIDEO ;

}

Вы можете использовать это перечисление следующим образом: DownloadType.AUDIO.ordinal(). Надеюсь, этот фрагмент кода поможет вам.

Ответ 6

Если вы объединяете перечисление со строкой, вы можете переопределить метод toString для возврата int:

public String toString() {
    return value + "";
}

Тогда вы можете просто использовать:

String something = "foo" + DownloadType.AUDIO;

и будет вызван метод toString().


Обратите внимание, что использование toString() программно обычно считается плохой практикой - оно предназначено только для глаз человека, однако это единственный способ добиться того, что вы просите.

Ответ 7

Вы хотите этот код?

public static enum FieldIndex {
    HDB_TRX_ID,     //TRX ID
    HDB_SYS_ID      //SYSTEM ID
}

public String print(ArrayList<String> itemName){
    return itemName.get(FieldIndex.HDB_TRX_ID.ordinal());
}