Java Enum return Int
у меня возникли проблемы с объявлением перечисления. То, что я пытаюсь создать, - это перечисление для "DownloadType", где есть 3 типа загрузки (аудио, видео, 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
7 ответов:
шрифт.Просто и не перечислимый. Это просто
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() {} }
кстати, the
value
поле на самом деле избыточно, потому что есть также.ordinal()
метод, так что вы можете определитьenum
как:enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }
и получить "значение" с помощью
DownloadType.AUDIO_AND_VIDEO.ordinal()
Edit: исправлен код..
static class
не допускается в Java. Смотрите это так ответ с объяснением и подробности о том, как определить статические классы в Java.
Если вам нужно получить значение int, просто есть геттер для значения в вашем перечислении:
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
сначала вы должны задать себе следующий вопрос:вам действительно нужен int?
цель перечислений-иметь коллекцию элементов (констант), которые имеют значение в коде, не полагаясь на внешнее значение (например, int). Перечисления в Java могут использоваться в качестве аргумента для состояний коммутатора, и их можно безопасно сравнить с помощью оператора равенства "= = " (среди прочих).
предложение 1 (не требуется int) :
часто нет необходимости в целое за ней.
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 (требуется int):
тем не менее иногда может быть полезно преобразовать перечисление в int (например, если внешний API ожидает значения int). В этом случае я бы посоветовал отметить методы как методы преобразования с использованием
toXxx()
-стиле. Для печати переопределитьtoString()
.private enum DownloadType { AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 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); //returns 0 System.out.println(DownloadType.AUDIO.name()); //returns AUDIO System.out.println(DownloadType.VIDEO.toInt()); //returns 1 System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 2
резюме
- не используйте целое число вместе с перечислением, если вам это не нужно.
- не полагайтесь на использование
ordinal()
для получения целого числа перечисления, потому что это значение может измениться, если вы добавите другую константу перечисления или измените порядок.- обычно не используйте константы int вместо перечислений (например, в принятом ответе), потому что вы потеряете безопасность типа (Как упоминалось в @KennyTM).
просто
ordinal()
метод на значение перечисления, чтобы получить его соответствующий номер. Нет необходимости объявлять атрибут сложения со своим значением, каждое перечисленное значение по умолчанию получает свой собственный номер, назначенный начиная с нуля, увеличиваясь на единицу для каждого значения в том же порядке, в котором они были объявлены.вы не должны зависеть от
int
стоимостьюenum
, только по его фактическому значению. Перечисления в Java-это другой вид монстра и не похожи на перечисления в C, где вы зависите от их целочисленного кода.Что касается примера, который вы указали в вопросе,
Font.PLAIN
работает, потому что это просто целочисленная константа класса font. Если вам абсолютно нужен (возможно, изменение) числовой код, тоenum
не является правильным инструментом для работы, лучше придерживаться числовых констант.
Вы можете попробовать этот код .
private enum DownloadType { AUDIO , VIDEO , AUDIO_AND_VIDEO ; }
вы можете использовать это перечисление следующим образом:
DownloadType.AUDIO.ordinal()
. Надеюсь, что этот фрагмент кода поможет вам .
Если вы объединяете перечисление со строкой, вы можете переопределить метод toString для возврата int:
public String toString() { return value + ""; }
затем вы можете просто использовать:
String something = "foo" + DownloadType.AUDIO;
и будет вызван метод toString ().
Обратите внимание, что использование toString () программно обычно считается плохой практикой - оно предназначено только для человеческих глаз, однако это единственный способ достичь того, что вы просите.