Почему я не могу создать enum во внутреннем классе Java?
Я пытаюсь сделать следующее:
public class History {
public class State {
public enum StateType {
Eclipse дает мне эту ошибку компиляции на StateType
: The member enum StateType must be defined inside a static member type
.
Ошибка исчезает, когда я ставил класс State
. Я мог бы сделать статический State
, но я не понимаю, почему я не могу объявить enum
во внутреннем классе.
Ответы
Ответ 1
enum
типы, которые определены как вложенные типы, всегда неявно static
(см. JLS §8.9. Перечисления)
У вас не может быть статический вложенный тип внутри нестатического (он же "внутренний класс", см. JLS §8.1.3. Внутренние классы и Enclosing Instances).
Поэтому вы не можете иметь внутренний тип enum
внутри нестатического вложенного типа.
Ответ 2
Уже достаточно информации из + Joachim Sauer, я просто добавляю дополнительные данные.
Вы можете определить внутреннее перечисление только в том случае, если ваш внутренний класс является статическим вложенным внутренним классом. См. Ниже
private static class DbResource {
public enum DB {
MERGE_FROM, MERGE_TO, MAIN;
}
}
Ответ 3
Если вы объявили enum следующим образом:
enum Suit {SPADES, HEARTS, CLUBS, DIAMONDS}
Компилятор Java будет синтезировать для вас следующий класс:
final class Suit extends java.lang.Enum<Suit> {
public static final Suit SPADES;
public static final Suit HEARTS;
public static final Suit CLUBS;
public static final Suit DIAMONDS;
private static final Suit[] $VALUES;
public static Suit[] values();
public static Suit valueOf(java.lang.String);
private Suit();
}
Нет намерения создавать другие экземпляры этого класса, отличные от тех статических полей, которые уже определены в нем (как вы могли бы сделать вывод из его частного конструктора), но самое главное, и, как упоминалось в принятом ответе, внутренний класс не может имеют статические члены (JLS §8.1.3. Внутренние классы и экземпляры Enclosing), и поскольку класс синтетического enum делает, это делает его неприемлемым, как внутренний класс.