Почему перечисление Java не может быть окончательным? - PullRequest
22 голосов
/ 27 марта 2012
public interface Proposal  {  
    public static final enum STATUS { 
        NEW ,
        START ,
        CONTINUE ,
        SENTTOCLIENT
    }; 
}

Java не позволяет перечислению быть final внутри интерфейса, но по умолчанию каждый элемент данных внутри интерфейса равен public static final. Кто-нибудь может уточнить это?

Ответы [ 4 ]

32 голосов
/ 27 марта 2012

Java не позволяет создавать класс, расширяющий тип enum. Поэтому сами перечисления всегда являются окончательными, поэтому использование ключевого слова final является излишним.

Конечно, в некотором смысле, enum не являются окончательными, потому что вы можете определить анонимный подкласс для каждого поля внутри дескриптора перечисления. Но было бы бессмысленно использовать ключевое слово final для предотвращения этих типов описаний, потому что люди должны были бы создавать эти подклассы в одном и том же файле .java, и любой, у кого есть на это право, мог бы так же легко удалить final ключевое слово. Нет никакого риска, что кто-то добавит ваше перечисление в какой-то другой пакет.

26 голосов
/ 27 марта 2012

Перечисление не может быть окончательным, потому что компилятор будет генерировать подклассы для каждой записи перечисления, для которой программист явно определил реализацию.

Более того, перечисление, где ни один экземпляр не имеет собственного тела класса,окончательно неявно, по JLS раздел 8.9 .

7 голосов
/ 27 марта 2012

Две вещи:

  1. перечисления являются окончательными подклассами java.lang.Enum
  2. , если перечисление является членом класса, оно неявно статично
2 голосов
/ 27 марта 2012

Нет смысла объявлять enum final. Окончательный для классов означает, что они не могут быть унаследованы. Однако перечисления не могут наследоваться по умолчанию (то есть они являются окончательными).

Последнее действительно только для переменных. Однако вы должны думать о перечислениях больше как о типах данных, чем о переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...