Вопрос

Есть ли способ написать перечисление, которое можно расширить. У меня есть несколько методов, которые я хотел бы всегда иметь в своем распоряжении. Например, я использую перечисление для полей моей базы данных. Я включаю фактическое имя поля в базу данных.

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 - это не та конструкция, за которой вы работаете. ИМХО они должны быть статическими константами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top