2012-03-27 5 views
18
public interface Proposal { 
    public static final enum STATUS { 
     NEW , 
     START , 
     CONTINUE , 
     SENTTOCLIENT 
    }; 
} 

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

+0

Вы считаете, что «не окончательное» перечисление является каким-то подклассам? –

+0

Нет, я знал, что перечисление не может быть подклассом, но java дает нам свободу писать окончательный из любой константы в интерфейсе, но не перед перечислением, почему это частично то, что я просил (просто пытаясь прочитать, что там в их уме, делая это?) –

+0

Существует огромная разница между тем, как 'final' используется между определениями класса/интерфейса (и, в принципе, перечисления) и определениями члена * поля * (что является тем, что« константы »обычно находятся в интерфейсе). Один влияет на подклассификацию, а другой влияет на изменчивость. –

ответ

21

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

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

25

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

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

+0

Полностью запутанный ответ. Если вы посмотрите на источник класса java.lang.Enum, вы увидите, что это не окончательный, а абстрактный класс. –

+2

Тем не менее, тип 'enum' не может быть подклассифицирован. –

+5

@EugeneKuleshov: класс Enum является абстрактным, потому что вы должны иметь возможность его продлить. Но фактические 'enum', которые расширяют его, определяются компилятором как 'final'. См. Http://mindprod.com/jgloss/enum.html#UNDERTHEHOOD1 – StriplingWarrior

6

две вещи:

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

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

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

Смежные вопросы