2015-05-06 15 views
7

Bitte schauen Sie sich link. In seinem Buch Effective Java sagt Joshua BlochKann ein Enum einen Konstruktor für jede seiner Konstanten haben

Beachten Sie, dass die Operation-Konstanten in die stringToEnum-Map aus einem statischen -Block, der ausgeführt wird, nachdem die Konstanten erstellt wurden.

Versuch jede Konstante Put sich in die Karte von eigenen seiner Konstruktor einen Kompilierungsfehler

zu machen verursachen würde. Das ist eine gute Sache, weil es eine NullPointerException verursachen würde, wenn es legal wäre.

Enum Konstrukteure sind nicht die Enum statische Felder, Ausnahme Kompilierung-Konstante Felder zugreifen dürfen.

Diese Einschränkung ist notwendig da diese statische Felder noch nicht initialisiert wurde, wenn die Konstrukteure laufen.

Ich habe zwei Fragen

  1. Kann Aufzählungen für jede Konstante getrennte Konstrukteure haben?
  2. Warum sind Kompilierzeitkonstantenfelder in Konstruktoren verfügbar, aber nicht in statischen Feldern?

Dank

+0

Können Sie Codebeispiel für diejenigen hinzufügen, die es nicht von Ihrem Link zugreifen kann? – Pshemo

+0

@Pshemo, Yes Sir, enthält Dieser Link ganzen Artikel 30 von Joshua Blochs Buch Effective Java https://ly2xxx.wordpress.com/page/5/?app-download=ios – Ankit

+0

Ich wollte es in Frage direkt stellen. Links neigen dazu, zu brechen, wenn es passiert, wird Ihre Frage für zukünftige Leser nutzlos sein. – Pshemo

Antwort

4

Wie für die erste Frage: Sie können nicht getrennt Konstrukteure haben, aber Sie können Behelfslösung dies auf folgende Weise:

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

    protected int val; 

    abstract void init(); 

    EnumTest() { 
     init(); 
    } 
} 

Auf diese Weise können technisch getrennte Initialisierungsmethoden für verschiedene Konstanten .

Ein anderer Weg ist initializer Abschnitte zu verwenden:

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

    protected int val; 
} 

Was Ihre zweite Frage: konstante Felder während Enum Konstruktion nicht zugänglich sind, weil Aufzählungskonstanten für statische Felder zugänglich sind. Zum Beispiel stellt dieser Code korrekt:

public enum EnumTest { 
    ONE, TWO; 

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

Wenn Zugriff auf ONE_STRING vom Konstruktor erlaubt wurden, würden Sie eine endlose Schleife Initialisierung oder Zugriff auf noch nicht initialisierten Enumeration Konstante entweder haben.

+0

Dank erhöht Sir – Ankit

4
  1. Nein, und ich glaube nicht, das ist, was Bloch bedeutet, obwohl es nicht formuliert worden in der bestmöglichen Art und Weise hat. Ein enum kann Konstruktoren haben, wie die enum Operation im Buch hat. Was Bloch mit "seinem eigenen Konstruktor" meint, ist: wenn der Konstruktor Operation für diese bestimmte Konstante läuft.

  2. beantwortet diese bereits durch das, was Sie oben zitiert:

    Diese Einschränkung, da diese statische Felder noch nicht notwendig ist, initialisiert, wenn die Konstrukteure laufen.

+0

Danke für Ihre Antwort Sir – Ankit

+0

Sorry, ich kann nur eine Antwort akzeptieren. Aber ich werde deine andere Antworten upvote Ihre Zahlen für die Antwort von +25 – Ankit

2

Die regulären Regeln für Konstruktoren gelten. Sie können so viele Konstruktoren haben, wie Sie möchten, solange sie unterschiedliche Signaturen haben. Verschiedene enum Werte können dann verschiedene Konstrukteure verwenden gebaut werden:

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

Vielen Dank für Ihre Antwort Misha – Ankit

+0

So sorry ich nur eine Antwort akzeptieren. Aber ich werde deine anderen Antworten aufwerten, um deine Anzahl um +25 zu erhöhen – Ankit