Java Workshop
Urheber: Andre Adrian
Datum: 05.Sep.2010
Einleitung
Der C
Workshop von mir ist gut aufgenommen worden. Vielen Dank für
diese Wertschätzung durch die Leserinnen und Leser. In der
Zwischenzeit ist die Programmiersprache Java älter als 10 Jahre
und wächst weiterhin. In einigen Bereichen wird nur "gut
abgehangene" Software eingesetzt, dies sind die Branchen der "late
adopters". Diese späten Vögel passen Java in ihren oft
strengen Software-Entwicklungsprozess ein. Ein Java Programmierer Guide
wird entworfen, welcher dem Programmierer bestimmte Java
Konstrukte verbietet und einen Katalog von Java "best practices"
vorstellt. Die Test-Abteilung definiert welche Tests der Programmierer
bei der Entwicklung durchzuführen hat und welche Tests bei der
Software-Integration, der Werksabnahme und der örtlichen Abnahme
durchzuführen sind. Wenigstens für jede ausgelieferte
Software muß auf Jahre die Fehlerbeseitigung möglich
bleiben. Der Kunde hat üblicherweise ein Recht auf Behebung von "latent defects".
Zur Quelltextverwaltung gehören Software-Werkzeuge (Tools)
für das Zusammenführen von verschiedenen Quelltextversionen
(merge tool) für z.B. back ports. Mit
doxygen oder javadoc wird Programmierer-Dokumentation aus den
Quelltexten gewonnen. Alle diese Tools müssen bei Hinzunahme einer
neuen Programmiersprache auf Eignung geprüft werden. Eventuell ist
Umstieg auf andere Tools zusammen mit der Schulung der Programmuierer
auf die neuen Tools nötig.
Java Marketing und
Java Wirklichkeit
"Klappern gehört zum Handwerk" - dies gilt auch für die
Marketing-Sprüche zum Thema Java. Zwischen Marketing-Wunsch und
Programmierer-Wirklichkeit ist auch bei Java Platz für einige
Elephanten. Eine leistungsfähige Programmiersprache ist wie ein
gutes Küchenmesser. Man kann prima Fleisch damit schneiden. Man
kann sich aber auch prima in den Finger schneiden. Java ist kein
stumpfes Plastikmesser und ist deshalb genauso gefährlich wie C
oder C++.
Write once, run
anywhere
Seit Java 1.4 gibt es assertion. Die assertion verlangt eine
Änderung im Java Compiler und eine Änderung in der Java
Virtual Machine (Java Runtime Environment). Die Einführung von
assertion war
inkompatibel. Aber Java war schon vorher Betriebssystem abhängig.
Der Zugriff auf Geräte (devices) wie der seriellen Schnittstelle
ist in jeder Programmiersprache, wenigstens im Gerätenamen,
abhängig vom Betriebssystem, auch
bei Java.
Java kennt keine
memory leaks
Bei den meisten GUI-Programmiersprachen welche GUI-Bibliotheken
benutzen besteht die Speicherverwaltung aus zwei Teilen. Eine
GUI-Variable wie ein Font hat ein Stück Speicher im
Java-Speicherraum und ein weiteres Stück Speicher im Speicherraum
der GUI Software. Ein memory leak im Java GUI Programm liegt oft an
einem Fehler in der Speicherverwaltung der GUI Software. Übliche
GUI Software sind Microsoft WinAPI32 oder das X Windows System. Auf
dieser Software
setzen Toolkits auf wie Motif oder Qt. Weder die GUI Software noch die
Toolkits sind in Java programmiert.
Der Garbage Collector von Java hat auch bei fehlerfreier
Implementierung nur eine begrenzte Intelligenz. Nicht jeder reservierte
Speicher auf den das Java Programm nicht mehr zugreifen kann, kann auch
vom Garbage Collector freigegeben werden. Das klassische Beispiel ist
die Ringliste. Die Ringliste besteht aus Referenzen von einem Objekt
zum nächsten Objekt. Das letzte Objekt zeigt auf der erste Objekt.
Vom Programm gibt es eine Referenz auf die Ringliste. Wird diese
Referenz entfernt ist die Ringliste nicht mehr vom Programm erreichbar,
kann aber auch nicht vom Garbage Collector gelöscht werden.
Java ist typsicher
Die Java Collections sind nicht typsicher. Der Rückgabewert hat
den Type Object. Ab Java Version 1.5 gibt es eine typsichere
Erweiterung der Collections. Der Programmierer wird aber nicht
gezwungen diese neue Eigenschaft zu nutzen.
Einsatz von Java
"Wer nur einen Hammer hat, dem erscheint die Welt als Nagel". Wer nur
die Programmiersprache Java kennt, wird jede Aufgabe mit Java
lösen wollen. Übliche Applikationen bestehen aus mehreren
Programmen die auf verschiedenen Computern in einem Netzwerk arbeiten.
Für die Benutzer-Schnittstelle ist Java gut geeignet. Für
Betriebssystem nahe Prozesse welche (exotische)
Geräte-Schnittstellen bedienen ist C besser geeignet. Die
verschiedenen Prozesse auf den verschiedenen Rechnern können per
TCP oder UDP miteinander kommunizieren. Die Kommunikation der Prozesse
auf einem Rechner kann auch über TCP oder UDP erfolgen.
Inhaltsverzeichnis
Java Programmierer
Guide
Dieser Programmers Guide soll die Softwarequalität von Java
Programmen
sicherstellen. Für jede Regel im Programmers Guide dürfte
sich eine
Ausnahme finden, welche die Regel widerlegt. "Die Ausnahme
bestätigt die Regel" ist dann das Leitmotiv. Viele dieser Regeln
sind allgemein bei der GUI Programmierung auch mit anderen
Programmiersprachen empfehlenswert.
Speicherbelegung
Speicherbelegung erfolgt üblicherweise durch den new Operator.
Eine Speicherbelegung innerhalb einer paint() Methode ist verboten. Das
gilt auch für Methoden die von paint() aufgerufen werden. Eine
Speicherbelegung sollte im Konstruktor stattfinden.
Sichtbare / nicht
sichtbare Widgets
Oft ist ein bestimmtes Widget nicht während der ganzen
Programmlaufzeit
sichtbar. Solche Widgets werden im Programm nur einmal erzeugt und dann
nach Bedarf sichtbar geschaltet oder nicht sichtbar geschaltet. Das
Erzeugen von Widgets nach der Initialisierung des Programmes soll
soweit als möglich vermieden werden.
Thread Synchronization
Thread Synchronization soll durch synchronized Methoden erfolgen, nicht
durch synchronized Abschnitte. Die Anzahl der Threads in einem Programm
ist möglichst klein zu halten. In jedem GUI-Programm gibt es nur
einen Thread für die GUI-Ausgabe und die Verarbeitung von
GUI-Events wie Mausklicks oder Tastatureingaben. Für Timer im
GUI-Thread soll die Klasse javax.swing.Timer benutzt werden.
Interface von
Taxonomie Klassen
Die Taxonomie der
Lebewesen wie Fische, Säugetiere und Vögel ist eine bekannte
hierarchische Klassifizierung. Die Vaterklasse eines solchen
Taxonomie-Klassenbaums soll nur die Methoden als Interface zur
Verfügung stellen welche auch von allen Kindklassen sinnvoll
implementiert werden können. Eine UnsupportedOperationExecption
wie bei den java.util Collections ist verboten. In einem
Taxonomie-Klassenbaum Guide sollen die für die Kindklassen
sinnvollen Methoden für das Klassen-Interface aufgeführt
werden damit der Klassenbaum eine einheitliche Schnittstelle
erhält.
Merge-Tools
Bei der Software-Entwicklung entsteht immer wieder die Aufgabe zwei
Versionen der gleichen Quelltext-Datei zu einer neuen Version dieser
Datei zu verschmelzen. Wenn ein Team von Programmierern an einem
Projekt arbeitet sind "Merge-Läufe" die Regel, nicht die Ausnahme.
Durch zentralisierte Versions-Kontroll-Systeme kann zwar die
Notwendigkeit für ein Merge verhindert werden, aber zu Lasten der
Produktivität der Programmierer. Und wenn ein Back-Port gefordert
wird vom oberen Management hilft dem kleinen Peitschenschwinger
über der Programmierergruppe sein zentralisiertes
Versions-Kontroll-System auch nicht mehr.
WinMerge
Wie der Name nahelegt ist WinMerge
ein MS-Windows Programm von Dean P. Grimm und anderen. WinMerge erlaubt
Merge und Edit. MS-Windows Programmierer sollten sich dieses GNU
General Public License Programm ansehen, wenn sie den Begriff "Open
Source" vertragen. Als Closed-Source Progger sollte man natürlich
keine Open-Source Software verwendet - das schadet mindestens der
Arroganz.

tkdiff
Ein echter Oldtimer ist tkdiff von John M.
Klassa. Tkdiff ist ein in Tcl/Tk programmiertes Frontend für das
UNIX Programm diff. Als Tcl/Tk Programm läuft tkdiff unter
MS-Windows, Linux und jedem anderen Betriebssystem mit Tcl/Tk
Interpreter. Auch bei tkdiff ist Merge möglich, aber nicht Edit.

meld
Meld gehört zu den
modernen Merge-Tools mit eingebautem Editor. Das Programm läuft
unter Linux, als GUI-Software wird Gnome Version 2 benutzt.
mgdiff
Mgdiff ist ein graphisches Frontend für das UNIX diff Kommando.
Mgdiff
ist ein Oldtimer, das zeigt sich an dem benutzten Motif Toolkit. Mit
Mgdiff lässt sich angenehm arbeiten, solange neben dem Merge
(Zusammenführen) nicht auch Editieren verlangt wird. Mgdiff ist
nur
unter HP-UX, Linux und anderen UNIXen verfügbar.
CoCo/R für Java
CoCo/R ist ein
Compiler-Compiler von Hanspeter Mössenböck und anderen von
der Universität Linz. CoCo/R ist vergleichbar mit ANTLR und JavaCC. Alle diese Werkzeuge
erzeugen aus einer Quelltextdatei mit
einer EBNF (Extended Backus Naur Form) Grammatik einen zweiten
Quelltext. Dieser Quelltext realisiert den Scanner
(Sprachsymbole-Erkenner) und den Parser (Sprache-Erkenner) für
eine Computersprache. Aus der EBNF Grammatik kann mit CoCo/R ein C#,
ein C++ oder ein Java Quelltext erzeugt werden. In dem Buch "Compiling
with
C# and Java" von Pat Terry wird der Einsatz von CoCo/R
erklärt. Das gemeinsame Wirken der Professoren
Mössenböck aus Österreich und Terry aus Südafrika
hat ein übersichtliches, gut brauchbares Software-Werkzeug
geschaffen.
CoCo/R erzeugt eine LL(1) Grammatik. Eine solche Grammatik wird auch
"rekursiv absteigender Parser mit 1 Sprachsymbol Vorschau" (recursive
decent parser with 1 token lookahead) genannt. Der rekursive Abstieg
besteht aus Funktionen (Methoden) die sich gegenseitig aufrufen. Neben
der LL(1) Grammatik ist die LALR(1) Grammatik durch die
Softwarewerkzeuge yacc
und bison bekannt. Diese Werkzeuge benutzen
Tabellen um der Parser zu steuern. Der von yacc und bison erzeugte
Quelltext ist sehr schwer (fast unmöglich) nachträglich um
neue Sprachkonstrukte oder um bessere Fehlerbehandlung zu erweitern.
Die Erweiterung des von CoCo/R erzeugten Quelltextes ist leichter
möglich.
Seit einiger Zeit gibt es ein CoCo/R Plugin
für Eclipse, welches die Arbeit weiter erleichtert. Wird die
CoCo/R Grammatik-Datei mit der Dateiendung .atg gespeichert, werden
automatisch die beiden Java-Dateien Scanner.java und Parser.java neu
erzeugt.
Installation CoCo/R
Plugin für Eclipse
Zuerst wird das CoCo/R Plugin von der Universität Linz
installiert. Hierzu muß der Entwicklungsrechner eine Verbindung
zum Internet haben.

Im zweiten Schritt wird ein Java Projekt wie üblich in Eclipse
angelegt. Über Rechts-Klick auf den Projektnamen lässt sich
die CoCo/R Erweiterung für dieser Projekt einschalten.

Im dritten Schritt wird eine ATG Datei neu erzeugt. In diese Datei wird
die EBNF Grammatik eingegeben. Hierzu nach Klick auf das Icon "New" im
Menü den Punkt "Other..." klicken. Es erscheint das "Select a
wizard" Fenster. Hier wird "Coco/R Parser and Scanner" ausgewählt.

Die ATG Datei muss in das src Verzeichnis des Projektes gelegt werden.
Dieser Container ist leider nicht der Default.

Neben der ATG Datei ist für einen lauffähigen Parser noch
eine Java Datei mit der main() Methode nötig. So sieht das Projekt
Asm6502 unter Eclipse aus:

Über den Urheber
Der erste praktische Kontakt mit GUI-Programmierung erfolgte durch
Digital
Research GEM zusammen mit Lattice-C Compiler auf dem Atari ST in den
1980er
Jahren. Durch Kontakt mit Parcplace Smalltalk-80 und Digitalk
Smalltalk/V wurden
gute Grundlagen gelegt für alle folgenden GUI-Projekte unter
MS-Windows und Linux. Seit 2001 verfügen die GUI-Programme in der
Regel über eine Touchscreen Bedienung. Der Autor bevorzugt die
Touchscreen Bedienung über Finger gegenüber der Bedienung mit
Stift. Der Finger ist immer dabei und wird gut behandelt. Der Stift ist
ein empfindliches Stück Hightech im Plastikgehäuse und hat
bei einigen Benutzern nur ein kurzes Leben.
Literatur
- Guido Krüger, Thomas Stark; Handbuch der Java
Programmierung; Addison-Wesley; 6. Auflage 2009
Klassisches Lehrbuch im Stil von "Programmieren in C" oder "Die C++
Programmiersprache".
- Ed Burnette; Eclipse IDE - kurz & gut; O'Reilly; 2. Auflage
2009
Kleines Buch über die IDE Eclipse.
- Kathy Sierra, Bert Bates; Java von Kopf bis Fuß; O'Reilly;
1. Auflage 2006
Frisches, lustiges Java Beispielprogramme-Buch.
- Alexander Niemann; Objektorientierte Programmierung in Java; bhv;
4. Auflage 2004
Kleines, günstiges Buch für den ersten Einstieg.
- David Flanagan; Java in a Nutshell, Deutsche Ausgabe für
Java 1.2 und 1.3; O'Reilly; 3. Auflage 2000
Eine frühe Referenz mit kurzer Java Einführung.
- David Flanagan; Java Foundation Classes, Deutsche Ausgabe
für Java 1.2; O'Reilly; 1. Auflage 2000
Eine frühe Referenz mit kurzer Einführung in AWT, Swing,
Java2D.