2011-10-12 8 views
44

Bir enum yapıcısı yalnızca sabitleri tarafından çalıştırılabildiğinden, neden paket özel hale getirilir?Neden enum paket özel yapım yapıcısına sahip olabilir?

+7

(arayüzler her yönteminden önce 'kamu abstract' gerekmez gibi) kodu alanı üzerinde biraz kaydetmek ve gereksiz ayrıntı önlemek için izin –

+0

@ratchetfreak: Eğer çalışırsanız, derleyici hatası alıyorum O var arayüzler gibi değil. Arayüz yöntemleri * her zaman * 'public abstract'. Değiştiricileri açık hale getirmeye izin verilir, ancak bunları değiştirmenin bir yolu yoktur. –

+0

@RyanStewart, enum kurucusunu kendiniz çağırmanın bir yolu da yoktur, bu nedenle mantıksal olarak özel hale gelir ve paketin özel olarak bu birkaç karakterin kaydedilmesine izin verir. –

cevap

70

Yapıcı aslında paket özel değil ... anahtar kelime eklemezseniz bile, arabirim yöntemleri örtülü olarak public olduğu gibi dolaylı olarak private olur.

JLS (§8.8.3) ilgili bölümü devletler:

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

atıf: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 –

+0

@Ryan Stewart: Bunu bulduğunuz için teşekkür ederiz. – ColinD

2

Bu dilin cilvesi var: enum kurucular örtük özeldir.

İlginçtir, böyle bir paket-görünür enum yapıcısı, ilan etmeleri halinde: Pakete başka sınıftan başvurabilmeniz edemez

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

Görünüşe göre bunu, enum statik iç içe sınıf sınıfı veya enum yöntemiyle deneyebilirsiniz. Evet, derleme söz konusu hata ile başarısız olur. – Vlasec

+0

"Bir paket görünür enum yapıcısı bildirirseniz ..." ancak aslında bunu yapmanın bir yolu yoktur. – raghavsood33

+0

@ raghavsood33 evet yapabilirsin. Paket görünür bir yapıcıyı gösteren cevabıma eklediğim derlenebilir kodlara bakın. – Bohemian

İlgili konular