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.

Zurück zum Inhaltsverzeichnis


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
intZahl = CInt("500")

//Typ vorangestellt
int intZahl;
String strText;

//Implizite Typenkonversion
strText = "Anzahl " + intZahl;

//Explizite Typenkonversion
intZahl = Integer.parseInt("500")

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
IF intCOUNTER = 0 then
  Response.Write("erster")
Else
  Response.Write("weitere")
EnD iF

int intCounter;

//Gross- und Kleinschrift muss stimmen
intCounter = 0;

//Schlüsselwörter sind in Java immer klein
if (intCounter == 0) {
  out.println("erster");
} else {
  out.println("weitere");
}

Zeilenfortsetzung versus Statement-Abschluss

ASP und Java weisen in Bezug auf Statements zwei verschiedene Philosophien auf: 

ASP Java
'einzeiliges Statement
intcounter = 0

'mehrzeiliges Statement
Response.Write("<p>" & strvorname _
  & "&nbsp;" & strname & "</p>" & vbCrLf)

//einzeiliges Statement
intCounter = 0;

//mehrzeiliges Statement
out.println("<p>" + strVorname 
  + "&nbsp;" + strName + "</p>");

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));

Zurück zum Inhaltsverzeichnis


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

Zurück zum Inhaltsverzeichnis


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:



Diese Webseite wurde am 03.05.18 um 22:34 von rothen ecotronics erstellt oder überarbeitet.

Impressum

Zurück zu rothen ecotronics

Printed on 100% recycled electrons!