2011-10-12 30 views
44

Vì một hàm tạo enum chỉ có thể được gọi bởi các hằng số của nó, tại sao nó được phép đóng gói riêng tư?Tại sao một enum có một nhà xây dựng gói-tư nhân?

+7

cho phép để tiết kiệm một chút trên không gian mã và để tránh rườm rà không cần thiết (như giao diện không cần 'abstract' công khai trước mọi phương pháp) –

+0

@ratchetfreak: Đó là không giống như giao diện. Các phương thức giao diện là * luôn luôn * 'abstract công khai'. Làm cho các công cụ sửa đổi được cho phép rõ ràng, nhưng không có cách nào để thay đổi chúng. –

+0

@RyanStewart cũng không có cách nào để gọi một hàm tạo enum, vì vậy nó trở nên riêng tư về logic và cho phép gói riêng tư cho phép lưu vài ký tự đó –

Trả lời

70

Nhà xây dựng thực sự không phải là gói riêng tư ... nó hoàn toàn là private cách thức giao diện theo cách hoàn toàn là public ngay cả khi bạn không thêm từ khóa.

Các phần có liên quan của JLS (§8.8.3) khẳng định:

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

trích dẫn: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 –

+0

@Ryan Stewart: Cảm ơn vì đã tìm ra điều đó. – ColinD

2

Đó là một điều không minh bạch của ngôn ngữ: constructors enum là ngầm tư nhân.

Điều thú vị là nếu bạn khai báo một enum constructor package-visible, như thế này:

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

    private final int i; 

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

    public int getI() { 
     return i; 
    } 
} 

bạn không thể đề cập đến nó từ một lớp khác trong gói. Nếu bạn cố gắng, bạn nhận được lỗi biên dịch:

Cannot instantiate the type MyEnum

+0

Rõ ràng bạn có thể thử điều này với enum là lớp lồng nhau tĩnh hoặc trong một phương thức của enum. Có, trình biên dịch không thành công với lỗi đã nói. – Vlasec

+0

"nếu bạn khai báo một hàm tạo enum có thể nhìn thấy gói" ... nhưng thực ra không có cách nào để làm điều đó. – raghavsood33

+0

@ raghavsood33 có bạn có thể. Xem mã compilable tôi thêm vào câu trả lời của tôi mà chứng minh một nhà xây dựng có thể nhìn thấy gói. – Bohemian

Các vấn đề liên quan