14.09.2024 23:48:50
Entwicklung: Michael Klein Letzte Änderung
14.01.2008 20:03:17
Meine Tip-Ecke
Autor: Michael Klein
Ich bin noch mit Röhrenrechnern aufgewachsen - diese Dinger hatten keine
Tastatur sondern kannten als Eingabe nur Karten, die mit Bleistift an den (hoffentlich!) richtigen Stellen markiert wurden.
Soll heißen: Ich mache den Job "Softwareentwicklung" schon eine Weile...
In der langen Zeit bis
heute sind mir immer wieder Dinge aufgefallen, die jeder beherzigen kann und oft scheinbar nur Kleinigkeiten
sind - aber einfach zu oft nicht beachtet werden. So sind die hier folgenden Tips meist ganz allgemeine
Ratschläge und Hinweise oder auch C++ - Funktionen, die man ständig braucht und nirgends zu
finden sind - also selbst schreiben, aber Vorschläge finden Sie ja hier :-)
Für
weitere Anregungen und Fehlerhinweise bin ich stets dankbar, dafür können Sie gerne das
Kontakt-Formular verwenden (Sie brauchen keine EMail-Adresse anzugeben, allerdings kann ich Sie dann nicht
kontaktieren).
Java Tips
Warum der StringBuffer meistens besser ist
Strings sind eine prima Sache - solange man sie nicht ädert. Das ist z.B. bei
Stringkonstanten wie
public static final String VERSION="1.0";
so.
Braucht man aber eine Zeichenkette, die öfter erweitert oder verändert wird, ist man
mit einem StringBuffer besser dran, denn der intern verwendete Puffer wird tatsächlich nur
einmal angelegt und dann ggf. lediglich erweitert. Nach den diversen Arbeiten ruft man dann einfach
StringBuffer.toString() auf dem jeweiligen StringBuffer-Objekt auf und fertig.
In Web-Servern mit großen Anwendungen kann diese Vorgehensweise eklatant zu Performance-Gewinn
führen und Speicherplatz-Probleme lösen helfen.
String.equals(...): Wie es oft viel einfacher geht
Ein nahezu unbekannter Trick im Umgang mit Strings ist das vereinfachte Vergleichen von Strings mit
Stringkonstanten. Nehmen wir o.g. Konstante VERSION und wollen sie mit einem String sVersion vergleichen,
schreiben praktisch alle Programmierer der Welt in etwa folgendes:
if(sVersion != null && sVersion.equals(VERSION))
{
...
}
Einfacher und auch besser ist aber:
if(VERSION.equals(sVersion))
{
...
}
Was ist der Unterschied? Nun, die Prüfung auf null kann man sich so sparen, denn die Stringkonstante kann
ja nie null sein (sie hat ja den Inhalt "1.0"), und ist sVersion null, liefert die equals()-Methode ohnehin
sofort FALSE zurück. Man vermeidet somit auch gleich den Fehler, die null-Prüfung zu vergessen und
sich eventuell eine NullPointerException einzuhandeln.
Was ist Stringpooling und wozu soll das gut sein?
Hat man viele lange und ähnliche Strings zu vergleichen, kann man dies folgendermaßen machen:
if(s1.intern() == s2.intern())
{
...
}
Der Vorteil ist dann ein deutlicher Performance-Gewinn. Das "==" ist möglich, weil die intern()-Methode
einen String zurückgibt, dessen Adresse eindeutig ist - mit anderen Worten, zwei Strings, die von
intern() zurückgegeben werden, sind das GLEICHE Objekt genau dann, wenn sie den gleichen Inhalt haben.
Eine bessere Hashtable
Ein nerviges Problem ist die Nullpointer-Exception der Hashtable-Klasse wenn man aus Versehen einen Key
erwischt hat, der null ist. Anstatt in der ganzen Anwendung nun die Keys abzuprüfen, ist es
einfacher, eine von der Hashtable abgeleitete Klasse zu verwenden, bzw. falls man eine JDK-Version hat,
in der die Hashtable noch als final class deklariert ist, eine Wrapper-Klasse, die eine Hashtable intern
benutzt und die Hashtable-Methoden einfach nach aussen weitergibt - natürlich nicht ohne vorher die
notwendigen Prüfungen vorgenommen zu haben. Beispiel werden sie hier später finden.
Aufgeräumt ist besser: public static final...
Angenommen, Sie verwenden in Ihrem Code Stringliterale wie z.B. "1.0" für die aktuelle Version oder
auch "German" für die aktuelle Anwendungssprache - diese Literale werden garantiert mehr als einmal
auftauchen! Was machen Sie nun, wenn die neue Version "1.1" lauten soll oder die Sprache
"English"? Genau, Sie durchforsten den ganzen Quellcode und ersetzen diese Stellen. Fassen Sie stattdessen
lieber logisch zueinander gehörende Literale als interface zusammen und benutzen dann dieses.
Das könnte zum Beispiel so aussehen:
interface AppConstants
{
public static final String VERSION=1.0;
public static final String LANGUAGE="GERMAN";
public static final int COUNTRYCODE=49;
}
Nun müssen Sie bei einer Änderung nur noch dieses interface anpassen - die ganze Anwendung bleibt
ansonsten unberührt.
C++ Tips (wird demnächst mit Leben gefüllt)
Besser ist das - die neue Syntax unter Microsoft Visual Studio 2005
Einfach und schnell: Strings und Zeichen ersetzen
Eine GUI für alle OSse: qt40