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

Почему я не могу создать 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 во внутреннем классе.

4b9b3361

Ответ 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 делает, это делает его неприемлемым, как внутренний класс.