JAVA-Tipps und -Tricks
© Silvia Rothen, rothen ecotronics, Bern, Schweiz
Autorin: Dr. Silvia Rothen, rothen ecotronics, Bern, Schweiz
Letzte Überarbeitung: 13.05.18
Hier finden Sie Programmiertricks zu Java, die ich in Büchern und im Internet gefunden habe und die sich in meiner Programmierpraxis bewährt haben. Ausserdem habe ich ein paar Stolpersteine beim Umstieg von ASP zu JSP/Java zusammengestellt.
Inhaltsverzeichnis
Einleitung
Der Umstieg von einer für's Web bestimmten Script-Sprache wie VBScript zu einer objektorientierten Universalsprache wie Java ist nicht einfach. Eine Syntax, die an das wenig benutzerfreundliche C++ angelehnt ist, hat mir ebenso das Leben schwer gemacht wie die Objektorientierung, die nach meinem stark prozeduralen Programmierstil in ASP eine gravierende Umstellung war. Und verglichen mit den Hunderten von Klassen und Tausenden von Methoden, die sich bereits in den Standardbibliotheken von Java befinden, sind die rund hundert Funktionen von ASP ein Klacks.
Auch jetzt, wo ich die Syntax von Java einigermassen beherrsche und die wichtigsten Bibliotheken des JDK kenne, bin ich noch meilenweit von einem guten Programmierstil entfernt. Objektorientiertes Design, Einsatz von Patterns und Performance-Optimierung sind die Fronten, wo ich im Moment am Kämpfen bin.
In dieser Rubrik stelle ich Tipps und Tricks zusammen, die ich mir zum Teil angelesen habe, die z.T. aber auch aus meiner eigenen Erfahrung stammen. Das ganze ist ein "Work in Progress", das mit meiner zunehmenden Erfahrung in Java wächst.
Umstieg von ASP zu JSP/Java
Auch wenn oft behauptet wird, dass die Syntax das einfachste sei, wenn man eine neue Programmiersprache lernt, stolpert man beim Umstieg von einer Sprache auf eine andere oft gerade über die Syntax. Alte Gewohnheit legt man nicht so schnell ab. Insbesondere beim Umstieg von ASP zu JSP gibt es ein paar Unterschiede in der Syntax, über die man chronisch stolpert. Die meisten davon findet der Compiler, aber die wenigen, bei denen das nicht der Fall ist, können zu bösen Fehlern führen.
Typen
VBScript, die am meisten benutzte Programmiersprache für ASP, kennt
nur einen expliziten Typ, nämlich Variant. Implizit gibt es die üblichen
Typen, wie man sie auch sonst in Programmiersprachen kennt. Das merkt man
spätens dann, wenn hässliche Laufzeitfehler einen darauf aufmerksam
machen, dass man zwei Texte nicht multiplizieren kann oder dass ein Texteingabe
eines Benutzers nicht in einem Datenbankfeld vom Typ Datum gespeichert werden
kann. Java ist dagegen eine streng typisierte Sprache, bei jeder
Variablen-Deklaration wird der Typ vorangestellt. Das braucht am Anfang mehr
Disziplin, führt dafür aber zu deutlich weniger Laufzeitfehlern.
Beide Sprachen kennen implizite Typenkonversionen, z.B. von
Integer zu String, sowie Funktionen oder Methoden zum expliziten Konvertieren
von Typen.
ASP | Java |
'Keine Typangabe Dim intZahl, strText 'Implizite Typenkonversion strText = "Anzahl " & intZahl; 'Explizite Typenkonversion |
//Typ vorangestellt int intZahl; String strText; //Implizite Typenkonversion strText = "Anzahl " + intZahl; //Explizite Typenkonversion |
Gross- und Kleinschreibung
Ein häufiger Fehler wird zwar vom Compiler erkannt, ist aber trotzdem am Anfang ziemlich lästig. ASP unterscheidet nicht zwischen Gross- und Kleinschreibung, JSP/Java dagegen schon. Dies betrifft sowohl Sprachelemente wie Namen von Variablen und Parametern.
ASP | Java |
Dim intCounter 'dies ist dieselbe Variable intcounter = 0 'Schreibweise in ASP spielt keine Rolle |
int intCounter; //Gross- und Kleinschrift muss stimmen intCounter = 0; //Schlüsselwörter sind in Java immer klein |
Zeilenfortsetzung versus Statement-Abschluss
ASP und Java weisen in Bezug auf Statements zwei verschiedene Philosophien auf:
- In ASP ist ein Statement grundsätzlich eine Zeile lang und muss deshalb nicht mit einem speziellen Zeichen abgeschlossen werden. Wenn ein Statement über mehr als eine Zeile läuft, dann muss am der Zeile das Zeichen _ als Zeilenfortsetzung stehen.
- In Java wird ein Statement wie in den meisten Programmiersprachen mit einem speziellen Zeichen, nämlich mit ; abgeschlossen. Da es einen klar definierten Abschluss hat, kann das Statement über beliebig viele Zeilen laufen. In Java ist es ausserdem auch möglich (aber nicht empfehlenswert), mehr als ein Statement auf eine Zeile zu packen.
ASP | Java |
'einzeiliges Statement intcounter = 0 'mehrzeiliges Statement |
//einzeiliges Statement intCounter = 0; //mehrzeiliges Statement |
Operationszeichen
Bei den Operationszeichen folgt Java leider der C++-Syntax. Das ermöglicht äusserst kompakte Statements, die dafür für all jene, die C++ nicht kennen, auf den ersten Blick ziemlich unverständlich sind.
Die Operationszeichen in Java werden nicht nur anders geschrieben, sondern sie funktionieren z.T. auch anders. Bei && für die logische UND-Verknüpfung ist das allerdings ein Vorteil, denn in Java wird die zweite Bedingung gar nicht mehr geprüft, wenn die erste Bedingung bereits nicht erfüllt ist. Damit lassen sich in Java Prüfungen in einem IF-Statement mit verknüpften Bedingungen abhandeln, die in ASP zwei verschachtelte IF-Statements benötigen.
Bedeutung | ASP | Java |
Vergleichsoperator logisches Gleich Vergleichsoperator logisches Ungleich Vergleichsoperator logisches UND Vergleichsoperator logisches NICHT Stringverkettung |
= <> AND NOT & |
== != && ! + |
Bedingungen
Zu den am häufigsten verwendeten Statements in einer Programmiersprache gehören vermutlich Bedingungen, d.h. IF-Statements. Leider unterscheidet sich hier die Syntax von ASP und JSP erheblich.
ASP | Java |
If sngzufallszahl
< 0.5 Then Response.Write("kleiner") Else Response.Write("grösser") End If |
if (sngZufallszahl
< 0.5) { out.println("kleiner"); } else { out.println("grösser"); } |
Mehrfachverzweigungen mit case
Mehrfachverzweigungen existieren sowohl in ASP wie JSP, doch sie unterscheiden sich nicht nur in ihrer Syntax. Während bei ASP immer nur genau ein Ast durchlaufen wird, werden in Java alle hintereinander folgenden Äste bis zum nächsten break abgearbeitet. Sowohl in ASP wie Java lässt sich mit case nur auf Gleichheit prüfen. In Java ist die Prüfung ausserdem auf die Typen char, byte, short, oder int eingeschränkt.
ASP | Java |
Select Case dattimeofday Case 0 Response.Write("So früh?" & _ "<br />" & vbCrLf) Case 1 Response.Write("Guten Morgen" & _ "<br />" & vbCrLf) Case 2 Response.Write("Guten " & _ "Nachmittag<br />" & vbCrLf) Case 3 Response.Write("Guten " & _ "Abend<br />" & vbCrLf) Case Else Response.Write("Sie leben " & _ zeitlos!<br />" & vbCrLf) End Select |
switch(datTimeofday)
{ case 0: out.println("So früh?<br />"); break; case 1: out.println("Guten Morgen<br />"); break; case 2: out.println("Guten Nachmittag!<br />"); break; case 3: out.println("Guten Abend<br />"); break; default: out.println("Sie leben zeitlos!<br />"); break; } |
Vergleich mit Strings
Die von mir aus gesehen hässlichste Fehlerquelle beim Umstieg von ASP auf JSP stammt daher, dass Strings in Java Objekte sind. Wenn man in Java wissen möchte, ob eine Variable einen bestimmten Textwert hat, darf man deshalb für den Vergleich nicht == verwenden (denn das prüft Objektidentität), sondern die Methode equals(..). Hässlich ist dieser Fehler vor allem, weil er nicht vom Compiler gefunden wird. Das Statement mit == ist ja gültig, es macht nur nicht das, was man eigentlich möchte.
ASP | Java |
If strText =
"Bild" Then .. End If |
If (strText.equals("Bild")
{ .. } |
Arrays mit flexibler Länge (ASP) versus Vectors (Java)
Arrays haben in ASP zwar eine definierte Länge, aber mit ReDim Preserve lässt sich ein solcher Array jederzeit verlängern, ohne dass der Inhalt verloren geht. Arrays in Java haben dagegen immer eine fixe Länge. Wenn man etwas anderes möchte, dann wechselt man vom Array zum Vector. Vectors kann man beliebig verlängern und in Arrays umwandeln.
ASP | Java |
Dim arrX(2) arrX(0) = "rot" arrX(1) = "blau" 'Vergrösserung ReDim Preserve arrX(3) arrX(2) = "gelb" 'Zugriff auf Array-Element Response.Write(arrX(1)) |
Vector vecX = new
Vector(); vecX.add("rot"); vecX.add("blau"); vecX.add("gelb"); 'Umwandlung in Array arrX = new String[vecX.size()]; vecX.copyInto(arrX); //Zugriff auf Vector-Element out.println(vecX.get(1)); |
Performance
StringBuffer statt String
Da Strings unveränderliche Objekte sind, werden bei jeder String-Verkettung neue Objekte erzeugt und die Erstellung von Objekten frisst bekanntlich Performance. Ins Gewicht fällt dies vor allem, wenn die String-Verkettung in Schleifen geschieht. Deshalb sollte man in Schleifen mit grosszügig dimensionierten StringBuffer-Objekten und deren Methode append(..) arbeiten und erst nach der Verkettung mit toString() den StringBuffer in einen String zurückverwandeln. Vor allem wenn Tausende von Iterationen stattfinden, ist der Performance-Gewinn dramatisch und kann das Hunderfache oder mehr betragen!
Falsch | Richtig |
private void
tippStringBuffer_F() { String strHelp = ""; for (int intC = 0; intC < 20000; intC++) { strHelp += "a"; } } |
private void
tippStringBuffer_R() { StringBuffer strbHelp = new StringBuffer(10000); for (int intC = 0; intC < 20000; intC++) { strbHelp.append("a"); } String strHelp = strbHelp.toString(); } |
Quelle: Bloch 2002, S. 159 f
Literatur, Links
Links zu Java, JSP, Servlets und zum Webdesign generell finden Sie in der Webdesign-Linkliste in der Unterkategorie "Programmiersprachen / Techniken".
Ausserdem haben mir folgende Bücher geholfen, Java zu lernen und meinen Programmierstil (hoffentlich) zu verbessern:
- Stephen Gilbert, Bill McCarty 1999: Object-oriented
Design in Java, Waite Group Press
Kommentar: Die Mischung aus Lehrbuch für OO-Design und Einführung in Java ist nicht immer sehr geglückt, trotzdem habe ich in Bezug auf Design vieles aus diesem Buch gelernt! - Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
1996: Entwurfsmuster - Elemente wiederverwendbarer objektorientierter
Software, Addison-Wesley
Kommentar: Wer ernsthaft Java programmieren will, kommt an Entwurfsmustern und damit am Klassiker der Gang of Four nicht vorbei! Einziger Nachteil des Buches ist, dass alle Beispiele in C++ erstellt sind. Wer Mühe hat mit der grauenhaften C++-Syntax, kann auf den nächsten Titel ausweichen. - Stephen Stelting, Olav Maasen 2002: Applied Java Patterns,
Sun Microsystems Press, Prentice Hall
Kommentar: Die Java-Alternative zum Gamma-Buch mit sehr viel Code - Joshoa Bloch 2002: Effektiv Java programmieren,
Addison-Wesley
Kommentar: Mein derzeitiger Liebling. Auf knapp 250 Seiten (zum Glück nicht schon wieder ein 1000-Seiten-Wälzer) werden gut strukturiert 57 Tipps für robusteren, flexibleren und schnelleren Java-Code vermittelt.
Diese Webseite wurde am 03.05.18 um 22:34 von rothen ecotronics erstellt oder überarbeitet.
Printed on 100% recycled electrons!