Java расширяемое перечисление - PullRequest
7 голосов
/ 21 октября 2008

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

public enum ORDERFIELDS
        {
            OrderID("Order_ID");
            private String FieldName;

            private ORDERFIELDS(String fname)
                {
                    this.FieldName = fname;
                }

            public String getFieldName()
                {
                    return FieldName;
                }
        } 

Ответы [ 6 ]

16 голосов
/ 21 октября 2008

Все перечисления неявно расширяются java.lang.Enum. Поскольку Java не поддерживает множественное наследование, перечисление не может расширять что-либо еще.

10 голосов
/ 21 октября 2008

Если я правильно понимаю, вы хотели бы сделать что-то вроде этого:

public abstract class DatabaseField {
    private String fieldName;

    private DatabaseField(String fieldName) {
        this.fieldName = fieldName;
    }

    public String getFieldName() {
        return fieldName;
    }
}

Затем определите свой enum для расширения этого класса. Однако, к сожалению, перечисление не может расширять класс, но оно может реализовать интерфейс, поэтому лучшее, что вы можете сделать в данный момент, это определить интерфейс, который включает метод getFieldName (), и чтобы все ваши перечисления реализовали этот интерфейс.

Однако это означает, что вам придется дублировать реализацию этого метода (и любых других) во всех ваших перечислениях. В есть несколько предложений о том, как минимизировать это дублирование.

6 голосов
/ 21 октября 2008

Абстрактные перечисления потенциально очень полезны (и в настоящее время не допускаются). Но есть предложение и прототип, если вы хотите побудить кого-то в Sun добавить его:

http://freddy33.blogspot.com/2007/11/abstract-enum-ricky-carlson-way.html

ВС RFE:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6570766

6 голосов
/ 21 октября 2008

Перечисления могут реализовывать интерфейсы, но не расширяться, поскольку при компиляции они преобразуются в java.lang.Enum.

0 голосов
/ 22 октября 2008

Ручная обработка перечисления в механизме, подобном тому, который определен в «Эффективной Java» Джоша Блоха.

Я бы добавил, что если вам нужно "расширить" перечисление, то, возможно, перечисление не та конструкция, за которой вы следите. ИМХО они должны быть статическими константами.

0 голосов
/ 21 октября 2008

Для возврата к 5-дневным периодам до Java, посмотрите на Item 21, Chapter 5, Effective Java by Josh Bloch . Он говорит о расширении «перечислений» путем добавления значений, но, возможно, вы могли бы использовать некоторые методы, чтобы добавить новый метод?

...