2015-05-06 21 views
7

Lütfen bu link'a bakın. Etkin Blogu adlı kitabında Joshua Bloch,Bir enum'un sabitlerinin her biri için bir kurucuları olabilir

diyor. Çalışma sabitlerinin, sabitler oluşturulduktan sonra çalışan bir statik bloğundan stringToEnum haritasına yerleştirildiğini unutmayın. den haritaya her sabit koymak kendisi yapmaya çalışıyorum

kendi yapıcı bir derleme hatayı

neden olur. Bu iyi bir şeydir çünkü yasal olması durumunda bir NullPointerException neden olur.

Enum kurucular derleme zamanı sabiti alanı haricindeki ENUM statik alanlar, erişmek için izin verilmez. kurucular çalıştırdığınızda bu statik alanlar henüz başlatılmamış çünkü

Bu kısıtlama gereklidir.

Ben iki soru

  1. Numaralamalar her sabit için ayrı kurucular olabilir mi?
  2. Derleme zamanı sabit alanları neden kurucularda erişilebilir, ancak statik alanlara erişemiyor?

Teşekkür

+0

Eğer bağlantıdan erişemez olanlar için kod örneği ekleyebilir miyim: Farklı enum değerler farklı bir oluşturucusu kullanılarak inşa edilebilir? – Pshemo

+0

@Pshemo, Evet Efendim, Bu bağlantı, Joshua Bloch'un etkili Java https://ly2xxx.wordpress.com/page/5/?app-download=ios – Ankit

+0

kitabından tüm Item 30'u içeriyor. Linkler kırılma eğilimindedir, bu durumda sorun, gelecekteki okuyucular için faydasız olacaktır. – Pshemo

cevap

4

: Ayrı kurucular olamaz, ancak işle etrafında bu şu şekilde:

public enum EnumTest { 
    ONE() { 
     void init() { 
      val = 2; 
     } 
    }, 
    TWO() { 
     void init() { 
      val = 1; 
     } 
    }; 

    protected int val; 

    abstract void init(); 

    EnumTest() { 
     init(); 
    } 
} 

teknik olarak farklı sabitleri için ayrı başlatma yöntemleri var Bu şekilde .

başka yolu da başlatıcısı bölümleri kullanmaktır: enum sabitleri statik alanlar için erişilebilir olduğu için sürekli alanlar, enum yapımı sırasında erişilemiyor:

İkinci soruya gelince
public enum EnumTest { 
    ONE() {{ 
      val = 2; 
     }}, 
    TWO() {{ 
      val = 1; 
     }}; 

    protected int val; 
} 

. Örneğin, bu kodu doğru derler: kurucusundan ONE_STRING erişen izin verildi

public enum EnumTest { 
    ONE, TWO; 

    public static final String ONE_STRING = ONE.toString(); 
} 

varsa, her zaman hali hazırda başlatılmış enum sabiti sonsuz başlatma döngü veya erişimin vardı ya ederim.

+0

numaranızı arttırmak için diğer cevaplarınızı vereceğim Cevabınız için teşekkürler Efendim – Ankit

4
  1. Hayır ve bunu en iyi şekilde formüle edilmemiştir getirdikleri halde, Bloch anlamı budur sanmıyorum. Bir enum kitabında, enum Operation kitabında olduğu gibi kurucular olabilir. Bloch "kendi kurucusu" ile ne anlama gelir: Operation kurucusu bu sabit için çalıştığında.

  2. Bu zaten yukarıda alıntılanan şey tarafından cevaplanır: kurucular çalıştırdığınızda bu statik alanlar henüz başlatılmamış çünkü

    Bu kısıtlama gereklidir. İlk soruya gelince

+0

Cevabınız için teşekkürler Sir – Ankit

+0

Üzgünüm, sadece bir cevabı kabul ediyorum. Ama cevaplarım +25 – Ankit

2

Kurucular için normal kurallar geçerlidir. Farklı imzalara sahip oldukları sürece istediğiniz kadar çok kurucuya sahip olabilirsiniz.

enum StringAndNumber { 
    Zero("zero"), 
    Five(5), 
    Pi("Pi", 3.14159); 

    private final String str; 
    private final Number num; 

    private StringAndNumber(String str) { 
     this.str = str; 
     this.num = null; 
    } 

    private StringAndNumber(Number num) { 
     this.num = num; 
     this.str = null; 
    }  

    private StringAndNumber(String str, Number num) { 
     this.str = str; 
     this.num = num; 
    } 
} 
+0

Cevabınız için teşekkürler Misha – Ankit

+0

Kusura bakmayın sadece bir cevabı kabul ediyorum. Ama +25'e kadar sayılarınızı arttırmak için diğer cevaplarınızı vereceğim – Ankit

İlgili konular