home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Initialisierung von Variablen

Es empfiehlt sich, Variablen zu initialisieren, so das möglich ist. Diese Variablen sollten auch dort deklariert werden, wo sie gebraucht werden, beispielsweise innerhalb von Schleifen. Dies erhöht die Lesbarkeit und hat keine nachteiligen Auswirkungen auf Performance oder Ressourcenverbrauch, weil der Java-Compiler die Deklaration aus der Schleife wieder entfernt.

Gutes Beispiel:

 

public void doSomething() {
Vector randomNumbers = new Vector();
// einiger Code hier ...
for (int i = 0; i < CONST; i++) {
Float random = new Float(Math.random());
randomNumbers.add(random);
}
}

 

Schlechtes Beispiel:

 

public void doSomething() {
Vector randomNumbers;
Float random;
// einiger Code hier ...
randomNumbers = new Vector();
for (int i = 0; i < CONST; i++) {
random = new Float(Math.random());
randomNumbers.add(random);
}
}

 

Es sei auch davor gewarnt, Variablen lokal (d.h. innerhalb eines durch geschweifte Klammern begrenzten Codeblocks) mit dem gleichen Namen zu verwenden, wie eine Variable außerhalb. Ein solches Beispiel wäre eine Klasse mit der Instanzvariablen name und eine Methode innerhalb dieser Klasse, die ebenfalls eine Variable name definiert.

Kontrollfluss

Der GOTO Befehl hat sich auch bis nach Java gerettet, dort in Form von continue, break, return. Man sollte sicher nicht so dogmatisch sein, zumindest die ersten beiden generell zu verbannen. Allerdings führen diese Schlüsselwörter besonders in geschachtelten Programmstukturen leicht zu Fehlern, weil sie sich irrtümlich auf die falsche Schleife bezogen.

Auch erschweren returns innerhalb einer Methode (anstatt an deren Ende) die Lesbarkeit des Codes.

Entschließt man sich diese Regeln zu missachten, ist die strenge Einhaltung der Codemetriken sehr empfohlen, welche beispielsweise die Länge von Methoden oder die Schachtelungstiefe reglementiert.

Übergabeparameter

Die Übergabeparameter eine Methode sind nicht nur auf maximal sieben zu beschränken (siehe Codemetriken), sondern auch auf Gültigkeit zu prüfen.

Beispiele:

     

  • Datums oder Zeitwerte müssen in einem bestimmten Intervall liegen (z.B. keine Werte in der Zukunft)
  • Numerische Werte sollten in einem bestimmten Wertebereich oder mit einer definierten Genauigkeit übergeben werden
  • Die Werte sollten nicht null sein. Besonders diese wird häufig nicht überprüft, mit den bekannten Konsequenzen

Generell empfiehlt es sich, die Übergabewerte möglichst spezifisch zu gestalten. So sollte ein Objekt vom Typ Date übergeben werden und nicht ein String in einem bestimmten Datumsformat.

Schließlich sollte bedacht werden, dass - sieht man von den primitiven Datentypen und Strings ab - die Parameter als Referenz und nicht als Wert übergeben werden. Dies könnte zur Folge haben, dass übergebene Werte zwar am Anfang der Methode geprüft werden, aber nachträglich in anderen Programmteilen so geändert werden, dass eine erneute Prüfung fehlschlagen würde.

TODO Beispiel einfügen

Um dies zu vermeiden, können sogenannte defensive Kopien genutzt werden, mit denen die Methode bzw. deren Klasse arbeitet, und die nicht von außen geändert werden können.

Performance

Java stand lange Zeit dem Vorwurf ausgesetzt, eine im Vergleich zu C oder C++ langsam auszuführende Sprache zu sein. Auch wenn sich diese Unterschiede mittlerweile sehr relativiert haben, so gibt es doch eine Reihe von Regeln, die zu effizienteren Programmen führen:

     

  • Keine umfangreichen Stringverknüpfungen mit dem + Operator. Anstelle empfiehlt sich der StringBuffer mit dessen append() - Methode
  • Reflection vermeiden, wo möglich
  • TODO: Liste ergänzen

Kapselung

Im Sinne der besseren Kapselung einer Klasse sollten Modifier wann immer möglich auf private oder zumindest protected gesetzt werden. Ohne getter und setter-Methoden sollte nur auf statische Klassenvariablen zugegriffen werden können.

Es sei daran erinnert, dass öffentliche Methoden, welche Fehler werfen, die Kopplung zwischen Klassen/Modulen verstärken.

Sonstiges

toString() Methode

Die toString() Methode sollte man auf jeder Klasse implementieren.

Beispiel

 

public class Student {
private String ivName = null;
private int matrikel = 0;

public Student(String name, String matrikel) {
ivName = name;
ivMatrikel = matrikel;
}

public String getName() {
return ivName;
}

public String getMatrikel() {
return ivMatrikel;
}

public String toString () {
return "The student's name is " + ivName +
" and her/his number is " + ivMatrikel;
}
}

 

Damit lässt sich einfach debuggen, es muss auch nicht überprüft werden, ob die Klasse null ist.

In unserem Beispiel

 

System.out.println(student);

 

anstatt

 

if (null != student) {
System.out.println("The student's name is " + student.getName());
} else {
System.out.println("The student is null!");
}