programing tip

Java의 내부 클래스에 열거 형을 만들 수없는 이유는 무엇입니까?

itbloger 2021. 1. 7. 07:42
반응형

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내부 클래스에서 선언 할 수없는 이유를 이해할 수 없습니다 .


enum중첩 유형으로 정의 된 유형은 항상 암시 적으로 정의됩니다 static( JLS §8.9. Enums 참조 ).

비 정적 유형 ( "내부 클래스"라고도 함, JLS §8.1.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. Inner Classes and Enclosing Instances ), enum 합성 클래스가 수행하므로 내부 클래스로 허용되지 않습니다.


+ Joachim Sauer의 정보는 이미 충분합니다. 추가 정보를 추가하고 있습니다.

내부 클래스가 정적 중첩 내부 클래스 인 경우에만 내부 열거 형을 정의 할 수 있습니다. 아래 참조

private static class DbResource {

    public enum DB {
        MERGE_FROM, MERGE_TO, MAIN;
    }
}

이것은 내 사용 사례에서 작동했습니다.

public class History {

    public interface HConstants{
         public enum StateType { PAST,CURRENT,FUTURE}
    }

    //Inner class
    public class State implements HConstants{
        public StateType stateField = StateType.PAST;

참조 URL : https://stackoverflow.com/questions/14858036/why-cant-i-create-an-enum-in-an-inner-class-in-java

반응형