Можно ли разделить перечисления на подклассы для добавления новых элементов?
Я хочу взять существующее перечисление и добавить к нему дополнительные элементы следующим образом:
enumA {a,b,c}
enumBextendsA {d}
/*B is {a,b,c,d}*/
Возможно ли это в Java?
Переведено автоматически
Ответ 1
Нет, вы не можете сделать это на Java. Помимо всего прочего, d тогда, по-видимому, это был бы экземпляр A (учитывая обычную идею "extends"), но пользователи, которые знали только о A, не знали бы об этом - что лишает смысла то, что enum является хорошо известным набором значений.
Если бы вы могли рассказать нам подробнее о том, как вы хотите использовать это, мы потенциально могли бы предложить альтернативные решения.
Ответ 2
Перечисления представляют собой полное перечисление возможных значений. Таким образом, (бесполезный) ответ - нет.
В качестве примера реальной проблемы возьмем будни, выходные дни и, при объединении, дни недели. Мы могли бы определить все дни внутри days-of-week, но тогда мы не смогли бы представлять свойства, характерные как для будних, так и для выходных дней.
Что мы могли бы сделать, так это иметь три типа перечислений с сопоставлением между буднями / выходными днями и днями недели.
Это включает в себя создание интерфейса и использование его там, где вы в данный момент используете enum. Затем заставьте enum реализовать интерфейс. Вы можете добавить больше констант, добавив дополнительный enum / класс, который также расширяет интерфейс. Вот общая идея:
Обратите внимание, что если вы хотите что-то вроде TrafficLights.valueof(String) вам придется реализовать это самостоятельно.
Ответ 4
По сути, ваше перечисление - это обычный класс, сгенерированный компилятором. Этот сгенерированный класс расширяется java.lang.Enum. Техническая причина, по которой вы не можете расширить сгенерированный класс, заключается в том, что сгенерированный класс является final. Концептуальные причины, по которым это является окончательным, обсуждаются в этой теме. Но я добавлю механику к обсуждению.
Вот тестовое перечисление:
publicenumTEST { ONE, TWO, THREE; }
Результирующий код из javap:
publicfinalclassTESTextendsjava.lang.Enum<TEST> { publicstaticfinal TEST ONE; publicstaticfinal TEST TWO; publicstaticfinal TEST THREE; static {}; publicstatic TEST[] values(); publicstatic TEST valueOf(java.lang.String); }
Возможно, вы могли бы ввести этот класс самостоятельно и удалить "final". Но компилятор не позволяет вам расширять "java.lang.Enum" напрямую. Вы могли бы решить НЕ расширять java.lang.Enum , но тогда ваш класс и производные от него классы не были бы экземпляром java.lang.Enum ... что, возможно, на самом деле не имеет для вас никакого значения!