Ich weiß nicht, wie ich meine "Setter" bei unveränderlichen Objekten nennen soll.
Für eine veränderbare Objektperson funktionieren die Setter folgendermaßen:
%Vor%Das ist alles gut und gut, aber was ist wenn Person unveränderlich ist?
%Vor% Was soll whatHereName
heißen?
BEARBEITEN: Ich muss Sachen in die "Setter" -Methode setzen, so:
%Vor% Der echte Code ist viel größer als dieser, daher reicht ein einfacher Aufruf der Methode copy
nicht aus.
EDIT 2:
Da es so viele Kommentare zu meinem gefälschten Beispiel gibt (das ist falsch), gebe ich Ihnen besser die link zu der realen Klasse ( Avatar
).
Die "Setter" -Methoden, die ich nicht kenne, sind updateStrength
, updateWisdom
... aber ich werde das wahrscheinlich in withStrength
bald ändern ..
Ich mag den jodatime Weg. das wäre mitName.
%Vor%mehr jodatime Beispiele: Ссылка
Scala-Fallklassen haben zu diesem Zweck eine automatisch generierte Methode kopieren . Es wird so benutzt:
%pr_e%
Wenn Sie beim Ändern eines Felds eine Validierung usw. durchführen müssen, sollte sich dies bei der ersten Erstellung des Objekts von der Validierung unterscheiden ?
In diesem Fall können Sie dann im Konstruktor einer Fallklasse die erforderliche Validierungs / Fehler-Werbelogik einfügen, die immer dann verwendet wird, wenn eine neue Instanz über die Methode copy
erstellt wird.
Sie könnten dafür eine einzige Methode definieren. Entweder copy
oder, falls es sich bereits um eine Fallklasse handelt, with
:
BEARBEITEN
Die Methode copy
im verknüpften Beispiel sollte folgendermaßen aussehen:
Hinzufügen zu Oleg Antwort, würden Sie die Klasse wie folgt schreiben:
%Vor%Sie würden es so verwenden:
%Vor%Die oben beschriebene Kopiermethode ist möglich, aber in Ihrem einfachen Fall würde ich einfach verwenden:
%Vor%Die Kopiermethoden zeigen ihre Stärken, wenn Sie Klassen haben wie:
%Vor% Zur Zeit verwende ich update<Field>
name Konvention für alle "Setter" -ähnlichen Methoden auf unveränderliche Objekte.
Ich kann set<Field>
nicht verwenden, da es zu sehr an die veränderbaren Setter in Java erinnert.
Wie findest du update<Field>
für alle Methoden, die eine neue Instanz derselben Identität wie die aktuelle Instanz zurückgeben?
Obwohl vorherige Antworten das Problem lösen, würde ich gerne erzählen, wie ich mit unveränderlichen Objekten (die nur syntaktischer Zucker sind) umgehen kann.
Um eine klarere Syntax (IMHO) zu erhalten, implementiere ich die Methode apply
in unveränderlichen Klassen und gebe das Ergebnis der Methode copy
in Fallklassen und einer neuen Instanz zurück, wenn es sich um eine reguläre Klasse handelt. zB:
Dies macht die "mutator" -Methode zur Standardmethode für jede Instanz dieser Klasse.
Tags und Links scala conventions