2008-10-21 5 views
7

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

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

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

      public String getFieldName() 
       { 
        return FieldName; 
       } 
     } 

ответ

10

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

public abstract class DatabaseField { 
    private String fieldName; 

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

    public String getFieldName() { 
     return fieldName; 
    } 
} 

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

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

16

Все перечислений неявно продлить java.lang.Enum. Поскольку Java не поддерживает множественное наследование, перечисление не может распространять ничего другого.

6

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

+0

Я думаю, что это самый разумный дизайн здесь, верно? Если enum реализует правый интерфейс, то вы знаете, что это перечисление полей базы данных. – 2008-10-21 13:45:30

0

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

6

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

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

Sun RFE:

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

0

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

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