Soru Bir enum bir paket-özel kurucuya neden sahip olabilir?


Bir enum yapıcısı sadece sabitleri tarafından çalıştırılabildiğinden, neden paket özel hale getirilir?


46
2017-10-12 23:57


Menşei


kod alanında biraz tasarruf sağlamak ve gereksiz ayrıntılardan kaçınmak için (arayüzler gibi) public abstract her yöntemden önce) - ratchet freak
@ratchetfreak: 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. - Ryan Stewart
@RyanStewart, enum kurucusunu kendiniz çağırmanın da bir yolu yoktur, bu yüzden mantıksal olarak özel hale gelir ve paketin özel olarak bu birkaç karakterin kaydedilmesine izin verir - ratchet freak
Düzeltilmeye hazırlanıyorum: "Enum türünde kurucu için erişim değiştirici belirtilmezse, kurucu özeldir." - JLS 8.8.3. Java öğreticisi yanlış veya en azından yanıltıcı görünüyor. - Ryan Stewart


Cevaplar:


Kurucu aslında paket-özel değil ... dolaylı olarak private arayüz metotları dolaylı olarak public anahtar kelimeyi eklemeseniz bile.

JLS'nin ilgili bölümü (§8.8.3) durumlar:

Normal sınıfın yapıcısı için erişim değiştirici belirtilmemişse, yapıcının varsayılan erişimi vardır.

Bir enum türünde kurucu için hiçbir erişim değiştirici belirtilmemişse, kurucu private.

Bir enum türünün kurucusu (§8.9) bildirilmişse, derleme zamanı hatasıdır. public veya protected.


75
2017-10-13 00:44



atıf: java.sun.com/docs/books/jls/third_edition/html/... - Ryan Stewart
@Ryan Stewart: Bunu bulduğunuz için teşekkürler. - ColinD


Bu dilin bir tuhafıdır: Enum yapıcılar gizlidir.

İlginç bir şekilde, paket görünür bir enum kurucusu bildirirseniz, bunun gibi:

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

    private final int i;

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

    public int getI() {
        return i;
    }
}

Bu pakette başka bir sınıftan başvuramazsınız. Eğer çalışırsanız, derleyici hatasını alırsınız:

MyEnum türünü başlatamıyor


2
2017-10-13 02:01



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
"bir paket görünür enum kurucusu bildirirseniz" ... ama aslında bunu yapmanın bir yolu yoktur. - raghavsood33
@ raghavsood33 evet yapabilirsin. Paket görünür bir yapıcıyı gösteren cevabıma eklediğim derlenebilir kodlara bakın. - Bohemian♦