2014-10-21 2 views
7

Java에서 내부 클래스를 포함하는 enum 클래스가 있습니다.열거 형의 내부 클래스는 Java에서 항상 정적입니까?

public enum MyEnum{ 
    VALUE_1, 
    VALUE_2; 

    private static class MyInnerClass // is static here needed or can it be removed? 
    { 
    } 
} 

PMD는 '정적'수정이 (위반의 필요하지 않은 것을 저에게 말한다 : (실제 코드에서 내부적으로 내부 클래스를 사용하는 열거 선언 몇 가지 방법이있다) 예를 들어

UnusedModifier 규칙). 이것이 맞습니까, 아니면 PMD 버그입니까?

참고 : This question은 중복되지 않으므로 여기에서 묻는 것과 반대입니다.

+1

JLS에 따르면 (http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#8.9), "명시 적으로 인스턴스화를 시도하는 것은 컴파일 타임 오류입니다 열거 형 ". 그래서 정적이 중복되는 것 같아요. – Tetramputechture

+1

JLS는'new MyEnum()'과 같은 것으로, enum 형으로 선언 된 내부 클래스를 인스턴스화하지 않습니다. –

답변

6

static 키워드가 중복되지 않습니다. 정적 중첩 클래스 (static 키워드 사용) 또는 내부 클래스 (없는 것)를 만들 수 있습니다. 첫 번째 경우 클래스는 특정 enum 값에 할당되지 않습니다. 당신이 MyEnum에서 직접 MyInnerClass의 인스턴스를 만들 수 없습니다 위의 예에서

public class Test { 
    public static void main(String[] args) { 
     MyEnum.VALUE_1.createInnerObject().showName(); 
     MyEnum.VALUE_2.createInnerObject().showName(); 
    } 

    public enum MyEnum { 
     VALUE_1, VALUE_2; 

     public MyInnerClass createInnerObject() { 
      return new MyInnerClass(); 
     } 

     private class MyInnerClass { 
      public void showName() { 
       System.out.println("Inner class assigned to " + MyEnum.this + " instance"); 
      } 
     } 
    } 
} 

:

enum 값 중 하나 - 두 번째 경우, 내부 클래스의 인스턴스는 둘러싸는 인스턴스가 필요 이 작업을 수행하기 위해
new MyEnum.MyInnerClass(); // this will fail 

, 당신은 static 중첩 클래스가 필요하지만, 당신은 MyEnum.this 같은 것을 사용할 수 없습니다.