Buchtipp: Effektiv Java programmieren

“Effektiv Java programmieren” (ISBN 3-8273-1933-1) von Joshua Bloch gehört eindeutig zur Pflichtlektüre jedes professionellen Javaprogrammieres. In 57 kurz gehaltenen Kapiteln werden Regeln und Tipps für einen robusten und sauberen Programmierstil definiert. Als kleinen Appetitanreger fasse ich zwei seiner Regeln zusammen.

Thema 9: Überschreiben Sie toString immer.

Die toString Methode von java.lang.Object gibt standardmässig den Klassennamen und den Hashcode des Objects zurück. Für Debuggingzwecke ist diese Information nicht besonders aussagekräftig, von daher sollte jede Klasse diese Methode überschreiben und in ihr sämtliche relevanten Inhalte des Objekts zurückgeben.

Beispiel:toString Methode aus SquareTile (Klasse zur Speicherung einer quadratischen Bildkachel in einer Kartenanwendung). Hier gibt die toString Methode die Koordinate der linken oberen Kante und die Breite zurück. Das ist beim Debugging (bzw. beim Logfile-Lesen) wesentlich hilfreicher als der Hashcode.

  1. public String toString() {
  2. return  “topLeftCoord: “ + topLeftCoord.toString() + \t +
  3. “width == height: “ + width;
  4. }

Thema 13: Bevorzugen Sie Unveränderbarkeit

Unveränderliche Klassen erlauben lediglich bei der Konstruktion des Objekts das Setzen von Werten. Im Nachhinein können keine Werte mehr gesetzt werden (Es gibt also keine Setter-Methoden). Zudem sind alle Felder als final und private deklariert.

Vorteil: Die Anzahl möglicher Zustände reduziert sich dramatisch, da das Objekt nach dem Konstruktor fertig initialisiert ist. Es gibt also keine unfertigen Objektstati, die man bei Methodenaufrufen überprüfen muss. Zudem sind solche Klassen automatisch Thread-sicher.
Die Javabibliothek verwendet viele unveränderliche Klassen, z.B. java.lang.String oder java.math.BigInteger .

Nachteil: Für jeden Wert muss ein eigenes Objekt erzeugt werden. Bei vielen und grossen Objekten kann dies recht kostspielig werden (bekanntester Effekt: Stringverkettung). Benötigt eine unveränderliche Klasse zudem viele Initialisierungsparameter, so leidet darunter die Lesbarkeit des Konstruktors, da hier alle Parameter übergeben werden müssen.

Comments are closed.