Почему перечисление Java не может быть окончательным?
public interface Proposal {
public static final enum STATUS {
NEW ,
START ,
CONTINUE ,
SENTTOCLIENT
};
}
Java не позволяет перечислению быть final
внутри интерфейса, но по умолчанию каждый элемент данных внутри интерфейса public static final
, Кто-нибудь может уточнить это?
4 ответа
Перечисление не может быть окончательным, потому что компилятор будет генерировать подклассы для каждой записи перечисления, для которой программист явно определил реализацию.
Более того, перечисление, в котором ни у одного экземпляра нет собственного тела класса, неявно является окончательным, согласно разделу 8.9 JLS.
Java не позволяет вам создавать класс, который расширяет enum
тип. Поэтому сами перечисления всегда являются окончательными, поэтому с помощью final
Ключевое слово излишне.
Конечно, в некотором смысле, enum
s не являются окончательными, потому что вы можете определить анонимный подкласс для каждого поля внутри дескриптора enum. Но было бы бессмысленно использовать final
ключевое слово, чтобы предотвратить эти типы описаний, потому что люди должны были бы создавать эти подклассы в одном и том же файле.java, и любой, кто имеет на это право, мог бы так же легко удалить final
ключевое слово. Нет никакого риска, что кто-то расширит ваше перечисление в какой-то другой пакет.
Две вещи:
- перечисления являются окончательными подклассами java.lang.Enum
- если перечисление является членом класса, оно неявно статично
Нет смысла объявлять enum final. Окончательный для классов означает, что они не могут быть унаследованы. Однако перечисления не могут наследоваться по умолчанию (то есть они являются окончательными).
Последнее действительно только для переменных. Однако вы должны думать о перечислениях больше как о типах данных, чем о переменных.