Java расширяемое перечисление
-
03-07-2019 - |
Вопрос
Есть ли способ написать перечисление, которое можно расширить. У меня есть несколько методов, которые я хотел бы всегда иметь в своем распоряжении. Например, я использую перечисление для полей моей базы данных. Я включаю фактическое имя поля в базу данных. Р>
public enum ORDERFIELDS
{
OrderID("Order_ID");
private String FieldName;
private ORDERFIELDS(String fname)
{
this.FieldName = fname;
}
public String getFieldName()
{
return FieldName;
}
}
Решение
Если я правильно понимаю, вы хотели бы сделать что-то вроде этого:
public abstract class DatabaseField {
private String fieldName;
private DatabaseField(String fieldName) {
this.fieldName = fieldName;
}
public String getFieldName() {
return fieldName;
}
}
Затем определите свой enum для расширения этого класса. Однако, к сожалению, перечисление не может расширять класс, но оно может реализовать интерфейс, поэтому лучшее, что вы можете сделать в данный момент, это определить интерфейс, который включает метод getFieldName (), и все перечисления реализуют этот интерфейс.
Однако это означает, что вам придется дублировать реализацию этого метода (и любых других) во всех ваших перечислениях. В этом вопросе есть несколько предложений о способах минимизации этого дублирования.
Другие советы
Все перечисления неявно расширяют java.lang.Enum
. Поскольку Java не поддерживает множественное наследование, перечисление не может расширять что-либо еще.
Перечисления могут реализовывать интерфейсы, но не расширяться, так как при компиляции они преобразуются в java.lang.Enum.
Абстрактные перечисления потенциально очень полезны (и в настоящее время не допускаются). Но есть предложение и прототип, если вы хотите лоббировать кого-то в Sun, чтобы добавить его:
http://freddy33.blogspot.com/ 2007/11 / абстрактно-перечислимый-Ricky-Карлсон-way.html
Sun RFE:
http://bugs.sun.com/bugdatabase/view_bug.do? bug_id = 6570766 р>
Чтобы вернуться к 5-дневным периодам до Java, ознакомьтесь с Пункт 21, глава 5, «Эффективная Java» Джоша Блоха . Он говорит о расширении "enums" добавляя значения, но, возможно, вы могли бы использовать некоторые методы, чтобы добавить новый метод? Р>
Ручная обработка перечисления в механизме, подобном тому, который определен в «Эффективной Java» Джоша Блоха.
Я бы добавил, что если вам нужно продлить " enum, то, возможно, enum - это не та конструкция, за которой вы работаете. ИМХО они должны быть статическими константами.