2011-10-12 3 views
44

열거 형 생성자는 상수로만 호출 할 수 있으므로 패키지 개인용으로 허용되는 이유는 무엇입니까?열거 형에 패키지 전용 생성자가있는 이유는 무엇입니까?

+7

이 (인터페이스는 모든 메소드 전에'공공 abstract' 필요하지 않습니다 같은) 코드 공간에 비트를 저장하고 불필요한 상세를 방지 할 수 있도록 –

+0

@ratchetfreak : 당신이하려고하면 컴파일러 오류가 그것입니다 인터페이스가 아닙니다. 인터페이스 메소드는 * 항상 *'public abstract'입니다. 수식어를 명시 적으로하는 것은 허가되고 있습니다 만, 변경할 수는 없습니다. –

+0

@RyanStewart 열거 형 생성자를 직접 호출하여 논리적으로 비공개가되고 패키지 전용으로 소수의 문자를 저장할 수있는 방법이 없습니다 –

답변

70

실제로 생성자가 package-private가 아닙니다. 암시 적으로 private 인터페이스 방법은 암시 적으로 public입니다. 키워드를 추가하지 않은 경우에도 마찬가지입니다.

JLS (§8.8.3)의 관련 섹션 상태 :

If no access modifier is specified for the constructor of a normal class, the constructor has default access.

If no access modifier is specified for the constructor of an enum type, the constructor is private .

It is a compile-time error if the constructor of an enum type (§8.9) is declared public or protected .

+4

인용문 : http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 –

+0

@ 라이언 스튜어트 : 찾아 주셔서 감사합니다. – ColinD

2

그것은 언어의 특질 : 열거 생성자는 암시 적으로 개인 있습니다.

흥미롭게도,이 같은 패키지 보이는 열거 생성자 선언하는 경우 : 패키지에 다른 클래스에서 참조 할 수 없습니다

public enum MyEnum { 
    A(0), 
    B(1); 

    private final int i; 

    MyEnum(int i) { 
     this.i = i; 
    } 

    public int getI() { 
     return i; 
    } 
} 

합니다.

Cannot instantiate the type MyEnum

+0

분명히 정적 인 중첩 클래스 인 열거 형이나 열거 형의 메서드로 이것을 시도 할 수 있습니다. 예, 오류가 발생하면 컴파일이 실패합니다. – Vlasec

+0

"패키지로 표시되는 enum 생성자를 선언하면"...하지만 실제로는 그렇게 할 방법이 없습니다. – raghavsood33

+0

@ raghavsood33 예. 할 수 있습니다. 패키지에 표시되는 생성자를 보여주는 내 대답에 추가 할 수있는 컴파일 가능한 코드를 참조하십시오. – Bohemian

관련 문제