Вы можете попытаться присвоить свойства ENUM, который вы пытаетесь создать, и статически построить его, используя загруженный файл свойств. Большой взлом, но это работает :)

ли добавлять и удалять элементы из перечисления в Java во время выполнения?

Например, могу ли я прочитать в метках и аргументах конструктора перечисления из файла?

@ saua, вопрос только в том, действительно ли это можно сделать из интереса. Я надеялся, что будет какой-то изящный способ изменить работающий байт-код, возможно, используяBCEL или что-то. Я также проверил сэтот вопрос потому что я понял, что не совсем уверен, когда следует использовать enum.

Я вполне уверен, что правильным ответом будет использование коллекции, которая обеспечивает уникальность, а не enum, если я хочу иметь возможность безопасно изменять содержимое во время выполнения.

 Joachim Sauer26 янв. 2009 г., 01:05
Обычно, если вы этого хотите, вы их неправильно используете. Не могли бы вы сказать нам, для чего вам это нужно?
 Daniel C. Sobral27 июл. 2016 г., 08:31
FWIW, это помогает тестировать случаи по умолчанию для включения перечислений.
 moffdub27 янв. 2009 г., 12:44
Мой ответ был реализован с HashMap за кулисами, так что вы можете гарантировать уникальность.

Ответы на вопрос(6)

м открытых статических конечных значений типа перечисления (см.Вот для примера). Фактически, до Java5 считалось, что наилучшей практикой является создание собственного перечисления таким образом, и Java5 представилаenum Ключевое слово как сокращение. Смотрите источник дляEnum <Т> Узнать больше.

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

Кроме того, сделайте себе одолжение и переопределитеequals, hashCode а такжеtoStringи, если возможно, создатьvalues метод

Вопрос в том, как использовать такое динамическое перечисление ... вы не можете прочитать значение "PI = 3.14" из файла для созданияenum MathConstants а затем идти вперед и использоватьMathConstants.PI где угодно...

 Ed Brannin01 сент. 2009 г., 16:57
Коллекции и массивы являются изменяемыми объектами (и объектами). Наличие «окончательного» массива просто означает, что вы не собираетесь изменять размер или иным образом переназначать массив, но оно все же позволяет вам заменять значения, которые уже вписываются в его границы.
 Tom Hawtin - tackline25 янв. 2009 г., 23:37
Никогда не пишите открытое статическое непустое поле массива - они не являются постоянными.
 brabster26 янв. 2009 г., 21:13
Это правда? Поскольку экземпляр в конце ссылки является неизменным, я не уверен, как вы могли бы на самом деле изменить его ... это просто перекрещенные провода, является ли он экземпляром массива или нет?

ования), и я столкнулся с этим - EnumBuster:http://www.javaspecialists.eu/archive/Issue161.html

Это позволяет добавлять, удалять и восстанавливать значения перечисления.

редактироватьЯ только что начал использовать это, и обнаружил, что есть некоторые небольшие изменения, необходимые для Java 1.5, с которым я в настоящее время застрял:

Добавьте массив copyOf статических вспомогательных методов (например, возьмите эти версии 1.6:http://www.docjar.com/html/api/java/util/Arrays.java.html)Измените EnumBuster.undoStack на стек<Memento>В undo () измените undoStack.poll () на undoStack.isEmpty ()? null: undoStack.pop ();Строка VALUES_FIELD должна быть "ENUM $ VALUES" для перечислений java 1.5, которые я пробовал до сих пор
Решение Вопроса

Во время компиляции вы можете захотеть сгенерировать ваш файл enum .java из другого исходного файла. Вы даже можете создать файл .class, как этот.

В некоторых случаях вам может потребоваться набор стандартных значений, но разрешить расширение. Обычный способ сделать это, естьinterface для интерфейса иenum который реализует этоinterface для стандартных значений. Конечно, вы теряете способностьswitch когда у вас есть только ссылка наinterface.

 megalucio19 окт. 2017 г., 17:10
Знаете ли вы, где я могу найти хороший пример перечисления, реализующего такой интерфейс? Я буду заинтересован в такой функциональности.
 Tom Hawtin - tackline20 окт. 2017 г., 23:54
@ megalucio Я думаю, я думал оjava.nio.file.StandardOpenOption docs.oracle.com/javase/8/docs/api/java/nio/file/... но есть такжеjava.net.StandardProtocolFamily а такжеjavax.tools.StandardLocation.
 megalucio23 окт. 2017 г., 18:51
Большое спасибо . Я посмотрю на это.

формирующий проект моей молодой карьеры.

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

Я хотел, чтобы мое решение выглядело так:

enum HatType
{
    BASEBALL,
    BRIMLESS,
    INDIANA_JONES
}

HatType mine = HatType.BASEBALL;

// prints "BASEBALL"
System.out.println(mine.toString());

// prints true
System.out.println(mine.equals(HatType.BASEBALL));

И у меня получилось что-то вроде этого:

// in a file somewhere:
// 1 --> BASEBALL
// 2 --> BRIMLESS
// 3 --> INDIANA_JONES

HatDynamicEnum hats = HatEnumRepository.retrieve();

HatEnumValue mine = hats.valueOf("BASEBALL");

// prints "BASEBALL"
System.out.println(mine.toString());

// prints true
System.out.println(mine.equals(hats.valueOf("BASEBALL"));

Поскольку мои требования заключались в том, что должна быть возможность добавлять члены в перечисление во время выполнения, я также реализовал эту функциональность:

hats.addEnum("BATTING_PRACTICE");

HatEnumRepository.storeEnum(hats);

hats = HatEnumRepository.retrieve();

HatEnumValue justArrived = hats.valueOf("BATTING_PRACTICE");
// file now reads:
// 1 --> BASEBALL
// 2 --> BRIMLESS
// 3 --> INDIANA_JONES
// 4 --> BATTING_PRACTICE

Я назвал его «паттерном» динамического перечисления, а вы читали ооригинальный дизайн а такжеего пересмотренное издание.

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

(Используя JCI, BeanShell или JavaCompiler)

Это позволит вам изменять значения Enum по вашему желанию.

Примечание: это не изменит классы, которые ссылаются на эти перечисления, так что это может быть не очень полезно в реальности.

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

Ваш ответ на вопрос