18.04.2024 07:37:00            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