열거 형 생성자는 상수로만 호출 할 수 있으므로 패키지 개인용으로 허용되는 이유는 무엇입니까?열거 형에 패키지 전용 생성자가있는 이유는 무엇입니까?
답변
실제로 생성자가 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
orprotected
.
인용문 : http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 –
@ 라이언 스튜어트 : 찾아 주셔서 감사합니다. – ColinD
그것은 언어의 특질 : 열거 생성자는 암시 적으로 개인 있습니다.
흥미롭게도,이 같은 패키지 보이는 열거 생성자 선언하는 경우 : 패키지에 다른 클래스에서 참조 할 수 없습니다
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
분명히 정적 인 중첩 클래스 인 열거 형이나 열거 형의 메서드로 이것을 시도 할 수 있습니다. 예, 오류가 발생하면 컴파일이 실패합니다. – Vlasec
"패키지로 표시되는 enum 생성자를 선언하면"...하지만 실제로는 그렇게 할 방법이 없습니다. – raghavsood33
@ raghavsood33 예. 할 수 있습니다. 패키지에 표시되는 생성자를 보여주는 내 대답에 추가 할 수있는 컴파일 가능한 코드를 참조하십시오. – Bohemian
이 (인터페이스는 모든 메소드 전에'공공 abstract' 필요하지 않습니다 같은) 코드 공간에 비트를 저장하고 불필요한 상세를 방지 할 수 있도록 –
@ratchetfreak : 당신이하려고하면 컴파일러 오류가 그것입니다 인터페이스가 아닙니다. 인터페이스 메소드는 * 항상 *'public abstract'입니다. 수식어를 명시 적으로하는 것은 허가되고 있습니다 만, 변경할 수는 없습니다. –
@RyanStewart 열거 형 생성자를 직접 호출하여 논리적으로 비공개가되고 패키지 전용으로 소수의 문자를 저장할 수있는 방법이 없습니다 –