Unveränderliche Objekte mit Objektinitialisierern

7

Ich habe den folgenden Versuch an einem unveränderlichen Objekt:

%Vor%

Dann versuche ich es so zu benutzen:

%Vor%

Aber der Objektinitialisierer schlägt fehl, da Name setter privat ist. Gibt es einen Weg, oder muss ich mich zwischen dem einen oder dem anderen entscheiden?

    
Matthew Scharley 20.08.2009, 05:39
quelle

4 Antworten

20

Sie können Objektinitialisierungen nicht mit unveränderbaren Objekten verwenden. Sie benötigen einstellbare Eigenschaften.

Ein unveränderliches Objekt bedeutet "ändert sich nicht nach der Erstellung". Indem man Name zu einem Konstruktorparameter macht, drückt man dieses Prinzip sauber aus.

Wenn das Objekt für einen verständlichen Konstruktor zu kompliziert wird, können Sie auch das Builder-Muster verwenden. Im Allgemeinen wird der Builder selbst über veränderbare Eigenschaften verfügen (die Sie in Objektinitialisierern verwenden können), und die Methode .Build () erstellt die tatsächliche Instanz.

BEARBEITEN (OP): Ich werde mein eigenes Beispiel für einen Builder hinzufügen, den ich hier erstellt habe, und dann diese Antwort akzeptieren, da sie eine vernünftige Lösung vorschlägt.

%Vor%

Sie können dann eine Instanz davon mit folgendem erstellen:

%Vor%

BEARBEITEN : Das ist meine Meinung zu dem Muster:

%Vor%

Hier ist Ihr Beispiel wie mit Builder<T> implementiert. Es nutzt die Scoping-Regeln verschachtelter Typen, um auf den privaten Setter zuzugreifen:

%Vor%

Es hat eine implizite Konvertierung in den Zieltyp, so dass Sie dies tun können:

%Vor%

Oder das:

%Vor%     
Bryan Watts 20.08.2009, 05:53
quelle
8

Sie müssen die Eigenschaft im Konstruktor festlegen, und Sie benötigen keine separate lokale Variable für die ID:

%Vor%

Erstellung:

%Vor%     
Guffa 20.08.2009 05:45
quelle
4

Machen Sie den Setter öffentlich oder erstellen Sie eine Konstruktorüberladung, um den Name der Eigenschaft festzulegen.

%Vor%

Der Anruf

%Vor%

entspricht

%Vor%

Um es wirklich unveränderlich zu machen, erstellen Sie ein Feld für die Eigenschaft Name und machen Sie es schreibgeschützt. Daher kann die Eigenschaft Name nur mithilfe des Konstruktors festgelegt werden und kann zur Laufzeit nicht geändert werden.

%Vor%     
Jehof 20.08.2009 05:40
quelle
3

Sie können keine Objektinitialisierer verwenden und haben ein unveränderliches Objekt, da Objekt-Initialisierer erfordern, dass die Eigenschaften-Setter öffentlich sind. Öffentliche Versorger meinen, dass es nicht unveränderlich sein wird.

Der einzige Weg wäre, die Unveränderlichkeit zu simulieren, indem Ausnahmen im Eigenschaftensetter geworfen werden, nachdem sie bereits einmal aufgerufen wurden.

Ich persönlich denke nicht, dass das ein guter Entwurf wäre, und ich würde fragen, warum Sie so sehr daran interessiert sind, Objektinitialisierer anstelle von Konstruktoren zu verwenden. Die Syntax ist fast identisch.

    
David Wengier 20.08.2009 05:46
quelle

Tags und Links