Objekte, dessen Zustände nicht verändert werden können, heißen immutable. Die Klassen deklarieren in so einem Fall keine öffentlichen Variablen und auch keine Methoden mit Seiteneffekten, die diese Zustände modifizieren könnten. Setter gibt es folglich nicht, nur vielleicht Getter.
Damit die Objekte ihre Werte bekommen, gibt es unterschiedliche Wege – parametrisierte Konstruktoren sind ein guter Weg. Die Belegungen lassen sich beim Konstruktoraufruf übergeben und so sehr gut direkt in finale Variablen schreiben. In der Java-Bibliothek gibt es eine Reihe solcher Klassen, die keinen parameterlosen Konstruktor besitzen, und nur einige parametrisierte, die Werte erwarten. Die im Konstruktor übergebenen Werte initialisieren das Objekt, und es behält diese Werte sein ganzes Leben lang. Zu den Klassen gehören zum Beispiel Integer, Double, Color, File oder Font.
Immutable-Objekte, die auch die equals(…)-Methode implementieren heißen Werteobjekt (engl. value object).
Wither-Methoden
Auch wenn sich Objekte mit Setten nicht ändern lassen, so soll es doch möglich sein, neue Objekte mit veränderten Zuständen zu erschaffen. Ein Blick auf die Klasse String zeigt zum Beispiel trim() und toUpperCase() – das Ergebnis sind neue Strings.
Um allgemein Zustandsvariablen zu verändern können Wither-Methoden verwendet werden; sie sind ähnlich wie Setter, nur verändern sie keinen Zustand am aktuellen Objekt, sondern führen zu einem neuen Objekt mit dem geänderten Zustand.
Getter | Setter | Wither |
Typ getXXX() | void setXXX(Typ xxx) | ImmutableTyp withXXX(Typ xxx) |
Namenskonvention der Getter, Setter, Wither für eine Property xxx
Dazu ein Beispiel. Ein Raum hat einen Namen und eine Größe. Die Exemplare sollen unveränderbar sein:
class Room { private final String name; private final int size; public Room( String name, int size ) { this.name = name; this.size = size; } public String getName() { return name; } public int getSize() { return size; } public Room withName( String name ) { return new Room( name, size ); } public Room withSize( int size ) { return new Room( name, size ); } }
The constructor(Room, int) is undefined.
public Room withSize(int size)
{
return new Room(this.name, size);
}
ups, danke