Archive for July, 2018

Buchtipp: Effektiv Java programmieren

Monday, July 30th, 2018

“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.

JSR 270 – Was ist neu in Java (”Mustang”) 6 ? – Teil 3

Monday, July 16th, 2018

Änderungen am Class-File Format:

Mustang bringt eine neue Form der Validierung von Klassen. Bisher wurden
Klassen vor der erstmaligen Ausführung in der VM mit einem zeit- und speicherintensiven
Verfahren verifiziert.
Die Verifizierung wird nun in zwei Phasen aufgeteilt: Beim Erzeugen der Klasse werden sogenannte “StackMap” Attribute gesetzt (Phase I), mit denen die Verifizierung zur Laufzeit (Phase II) wesentlich schneller ausgeführt werden kann. Ein StackMap Attribut beschreibt die möglichen Zustände des Stacks und der lokalen Variablen nach der Ausführung der Methode. Dieses Verfahren benötigt zum einen weniger Bytecode innerhalb der VM und zum anderen weniger Speicher im Verifizierungsprozess.

Diese neue Form der Validierung ist übrigens gar nicht so neu: Die Idee ist aus der J2ME-Spezifikation CLDC. Aufgrund der Speicher- und Resourcenbeschränkungen konnte die standardmässige Java-Verifizierung nicht im mobilen Umfeld eingesetzt werden, von daher musste ein neues Verfahren entwicklet werden, dass nun mit Mustang auch Einzug in die J2SE-Welt findet.

Allerdings birgt die Verifizierung über StackMaps auch potentielle Sicherheitslücken: Der polnische Sicherheitsexperte Adam Gowdiak konnte über die StackMap Attribute die Sandbox einer J2ME-VM umgehen und direkt auf native Methoden des Betriebssystems zugreifen. Siehe “Java 2 Micro Edition security vulnerabilities” (Achtung: PDF ist über 55MB gross!)