Подтвердить что ты не робот

Почему Java-перечисление не может быть окончательным?

public interface Proposal  {  
    public static final enum STATUS { 
        NEW ,
        START ,
        CONTINUE ,
        SENTTOCLIENT
    }; 
}

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Две вещи:

  • перечисления являются окончательными подклассами java.lang.Enum
  • Если перечисление является членом класса, оно неявно статично

Ответ 4

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

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