#java #enums #getter-setter #pojo
#Ява #перечисления #геттер-сеттер #пожо
Вопрос:
public enum EventTypeName { MAIN_EVENT(new MainEvent()), MAIN_ADJUSTMENT_EVENT(new MainAdjustmentEvent()), CUSTOMER_EVENT(new CustomerEvent()), EventType eventType; private EventTypeName(EventType eventType) { this.eventType = eventType; } public EventType getEventType() { return eventType; } }
Мне нужно создать геттеры, геттеры и сеттеры для всех новых событий, которые будут объявлены в перечислении.
Комментарии:
1. Вы уже успешно это сделали. При первой загрузке класса перечисления будет создан экземпляр каждого из именованных объектов. В рамках этого создания новый субъект, который предположительно является подклассом
EventType
, будет сохранен в названном поле участникаeventType
. (Кстати, вы, возможно, захотите создать это полеprivate
.) И у вас есть метод получения для извлечения этогоEventType
объекта.EventType et = EventTypeName.CUSTOMER_EVENT.getEventType() ;
Так в чем же ваш вопрос?2. Это не должно быть таким образом MAIN_EVENT(новое событие()), MAIN_ADJUSTMENT_EVENT(новое событие()), CUSTOMER_EVENT(новое событие()), Они должны создаваться автоматически при вызове от других, и объект должен быть назначен @BasilBourque
3. Вы не можете динамически создавать
enum
экземпляры. перечисление можно использовать только в том случае, если во время компиляции известно, какие существуют экземпляры / значения.4. Можем ли мы сделать это каким-либо другим способом, чтобы он создавался динамически. Мое требование состоит в том, чтобы заставить его создавать динамически
5. Вы имеете в виду, что хотите, чтобы каждый вызов
getEventType
метода возвращал новый экземпляр одного из трех подклассов? Если это так, то это возможно, но, скорее всего, это плохое использование перечисления.
Ответ №1:
Очевидно, вы хотите создать новый подкласс EventType
для каждого из различных объектов перечисления при getEventType
вызове метода.
В этой ситуации не называйте свой метод get
префиксом. В широко используемых соглашениях JavaBeans такой префикс указывает вспомогательный метод для извлечения свойства объекта. Учитывая ваши намерения, префикс new
или make
может быть более подходящим.
public enum EventTypeName { MAIN_EVENT , MAIN_ADJUSTMENT_EVENT , CUSTOMER_EVENT ; // Assumes MainEvent, MainAdjustmentEvent, and CustomerEvent are all subclasses of EventType. public EventType makeEventType() { if ( this.equals( MAIN_EVENT ) ) { return new MainEvent() ; } if ( this.equals( MAIN_ADJUSTMENT_EVENT ) ) { return new MainAdjustmentEvent() ; } if ( this.equals( CUSTOMER_EVENT ) ) { return new CustomerEvent() ; } } }
Использование.
EventType eventType = EventTypeName.MAIN_ADJUSTMENT_EVENT.makeEventType() ;
У меня возникает тревожное чувство, когда я смотрю на ваш код, подозревая плохой или неправильный дизайн. Вероятно, из-за неправильного понимания перечислений на Java. Перечисление не следует рассматривать как коллекцию. Вы не можете определить дополнительные объекты перечисления во время выполнения; они определяются во время компиляции.
Комментарии:
1. В этом случае, если новое событие представлено как публичное событие, а класс для него создан как PublicEvent. Для этого мне нужно создать экземпляр нового объекта, но он должен быть не из этого перечисления, а из того места, где мы называем это перечисление
2. @Fahd Я понятия не имею, что ты имеешь в виду.
3. оттуда, откуда я вызываю это перечисление, следует создать экземпляр объекта и выполнить требования. Например, если есть новое событие, я не должен приходить и добавлять его сюда в перечислении каждый раз и называть это..
4. @Fahd Я подозреваю, что вы неправильно понимаете роль перечислений в Java. Прочитайте последние два предложения моего пересмотренного ответа. Если вы хотите изменить набор объектов во время выполнения, не используйте перечисления, используйте коллекцию.
5. Это прекрасно подходит для любой концепции. Могу я узнать, как я могу решить свои требования в любой концепции @Basil Bourque