Und überall sitzt die OSGi Service Platform drunter…

Unter http://www.earthtimes.org/articles/show/world-leading-enterprise-application-server-providers,541827.shtml und http://www.osgi.org/blog/2008/09/impressive-press-release.html führen die Autoren auf, wie beliebt mittlerweile OSGi als Basis für Java EE Container ist. Peter Kriens führt folgende Container auf:

  1. IBM Websphere. They started in 2006 and aggresively moved their code on OSGi. Obviously it helped that IBM has committed itself to OSGi since day -1.
  2. Oracle WebLogic. Formerly known as BEA weblogic. BEA was one of the first companies public touting the advantages of OSGi, clearing the road for others.
  3. Paremus Infiniflow. Paremus has pioneered the use of OSGi in highly distributed application servers allowing the system to scale to unprecendented heights.
  4. ProSyst ModuleFusion. ProSyst is the key provider of OSGi technology in the embedded worlds but originated from the development of a J2EE server. They are now back in this market with an offering based completely on OSGi.
  5. Redhat JBoss. JBoss already worked with a microkernel approach but recognized the advantages of a standard two years ago.
  6. SAP Netweaver. Well, they are not yet based on OSGi, but they clearly see their future based on the OSGi specifications and are becoming more and more active in the OSGi Alliance.
  7. SpringSource Application Platform. The company that simplified Enterprise development with their Spring Framework decided to create their own offering in the application server market completely based on the OSGi specifications.
  8. Sun Glassfish. And last, but definitely not least, Sun decided to use OSGi in the JEE reference implementation Glassfish. They clearly take OSGi extremely serious nowadays since they also hired Richard S. Hall. It is so good to see Sun back at the OSGi Alliance.

Interessant sind zwei Feststellungen:

  1. In der Regel geben die Container die OSGi-Implementierung nicht nach oben weiter, abstrahieren also von den Internas. Nur einige Produkte erlauben, auch selbst OSGi-Bundles anzumelden.
  2. Java EE und das SpringFramework sind beides Nutznießer der OSGi-Plattform. Man kann nun fragen, ob man sich überhaupt noch mit OSGi selbst beschäftigen muss, wenn etwa GlassFish oder http://www.springsource.com/products/suite/applicationplatform gute Abstraktionen bieten.

Das erste Android Programm

Im Moment gibt es ein großes Rumgezampel wegen der NDA von Apple bei der Entwicklung von iPhone-Applikationen und das, was es als Applikationen in den Apple App Store darf und was nicht

Google macht das mit Android besser, da hier alles frei sind wird und auch jede Applikation in den Store kommt. Und ein erstes Programm ist schnell aufgebaut:

  1. Gehe auf http://code.google.com/android/download_list.html.
  2. Lade unter Windows zum Beispiel android-sdk-windows-1.0_r1.zip. Entpacke das Zip, etwa nach C:\Program Files\Java\android-sdk-windows-1.0_r1.
  3. Installiere über den Eclipse Update-Manager das Plugin unter der URL http://dl-ssl.google.com/android/eclipse/. Das dauert! Starte Eclipse neu.
  4. Unter Window > Preferences > Android trage das Verzeichnis C:\Program Files\Java\android-sdk-windows-1.0_r1 ein.
  5. Gehe auf http://code.google.com/android/intro/hello-android.html und führe die Schritte für ein neues Android-Projekt durch.
  6. In die generierte onCreate()-Methode setzte rein:
  7. super.onCreate(savedInstanceState);
    TextView tv = new TextView(this);
    tv.setText("Hello, Android");
    setContentView(tv);
  8. Starte die Applikation wie unter http://code.google.com/android/intro/hello-android.html#run beschrieben im Emulator. Das dauert leider sehr lange!

Thema der Woche: Continuous Integration mit Hudson

Lies zunächst http://martinfowler.com/articles/continuousIntegration.html von Martin Fowler über die Motivation von CI in der Softwareentwicklung.

In den letzten Monaten hat sich das Hudson zu einem Publikumslieblig entwickelt. Studiere die folgende Präsentation:

(Hudson stammt vom Kohsuke Kawaguchi, der eine ganze Reihe sehr interessanter Projekte bei Sun macht, etwas JAXB oder auch https://com4j.dev.java.net/. Wer ein Podcast von ihm und Husdon hören möchte: http://blogs.sun.com/glassfishpodcast/entry/episode_007_interview_with_kohsuke)

Blättere ein wenig auf den Seiten unter http://hudson.gotdns.com/wiki/display/HUDSON/Meet+Hudson. Falls ein Projekt mit CSV- oder SVN-Zugriff verfügbar ist teste Hudson.

Java Wikipedia API

Wer von Java aus auf die Inhalte von Wikipedia zugreifen, und die Inhalte auch noch Rendern möchte, findet mit der quelloffenen Java Wikipedia API (http://www.matheclipse.org/en/Java_Wikipedia_API) eine passende Unterstützung.

Zum Laden einer Wikipedia-Seite und Renderer in eine Datei ist lediglich nötig:

User user = new User( "", "", "http://de.wikipedia.org/w/api.php" );
List<Page> queryContent = user.queryContent( Arrays.asList( "Java (Programmiersprache)" ) );
String content = queryContent.get( 0 ).getCurrentContent();

WikiModel wikiModel = new WikiModel( "http://de.wikipedia.org/wiki/${image}",
                                     "http://de.wikipedia.org/wiki/${title}" );

String rendererdHtmlContent = wikiModel.render( content );

FileWriter fw = new FileWriter("c:/test.html");
fw.write( rendererdHtmlContent );
fw.close();

Einige Dinge löst der Renderer aber nicht auf. So verbleiben im Text Wiki-Templates wie

  • {{Infobox Programmiersprache}}
  • {{IPA}}
  • {{Wikiversity}}
  • {{Wikibooks}}

oder bei anderen Texten

  • {{Begriffsklärungshinweis}}
  • {{Commonscat}}
  • {{internetquelle}}
  • {Literatur}}

Auch Bilder werden standardmäßig nicht richtig umgesetzt. So wird bei http://de.wikipedia.org/wiki/Linux aus

[[Bild:Linus Torvalds.jpeg|thumb|right|Linus Torvalds 2004]]

kein Bild, sondern ein Link

<a href="http://de.wikipedia.org/wiki/Bild:Linus_Torvalds.jpeg%7Cthumb%7Cright" id="w">Linus Torvalds 2004</a>

Dumm nur, dass %7Cthumb%7Cright falsch ist, sonst wäre wenigstens der Link korrekt. (%7C ist |)

HOWTO Add a JDBC DataSource/JNDI to GlassFish

Use asadmin with option create-jdbc-connection-pool first:

asadmin create-jdbc-connection-pool --datasourceclassname org.apache.derby.jdbc.EmbeddedDataSource --property databaseName=\$\{com.sun.aas.instanceRoot\}/databases/tutegodb:connectionAttributes=\;create\=true tutegoPool

Use asadmin again to install the actual JNDI name:

asadmin create-jdbc-resource --connectionpoolid=tutegoPool jdbc/tutego

To remove the pool and all attached JNDI names:

asadmin delete-jdbc-connection-pool --cascade tutegoPool

DZone-Interview mit Sacha Labourey über JBoss AS 5

Gibt es unter http://java.dzone.com/videos/tech-chat-sacha-labourey-jboss.

Natürlich galt es im Interview zu klären, warum man auf JBoss 5 so lange warten muss. Fertig ist er aber immer noch nicht!

We are very close to GA.

Warum noch immer nicht soweit? Weil der JBoss einen ganz neuen Microcontainer bekommt und weil unter anderem die Messaging-Lösung (JBoss Messaging) neu entwickelt wurde und JBoss 5 einen neuen Transaktions-Monitor bekommt. Einen Lacher erntet er bei mir aber mit:

Intuitively people usually think that it is an issue with the J2EE spec and how much time it took us to implement this pretty significant update of the J2EE spec.

JBoss war immerhin einer der ersten Container, die EJB 3 unterstützten. Aber Web-Services machen den JBoss 4 immer etwas Probleme, was auch an der Integration von Axis lag.

Ich sehe eher weniger gute Zukunfsaussichten für JBoss. Mit der wachsenden Popularität von GlassFish und Geronimo wird JBoss 5 zu kämpfen haben. GlassFish und Geronimo/IBM WASCE sowie WebLogic Server v10.0, SAP NetWeaver 7.1, Apusic Application Server, TmaxSoft JEUS 6, NEC WebOTX 8.1 sind (zum Teil schon sehr lange) Java EE 5 zertifiziert (http://java.sun.com/javaee/overview/compatibility.jsp) und JBoss 5 hat das auch noch vor sich.

Weiterhin glaube ich in der Java-Community einen Trend in Richtung der Sun-Implementierungen erkennen zu können, was zum Beispiel die RI für JavaServer Faces, aber auch etwa JAX-WS für Web-Services angeht. Interessant ist auch, dass GlassFish die JSP-Servlet-Übersetzung optimiert über JSR 199 regelt, eine Entwicklung, die eben nicht von Tomcat ausgeht. So nutzt auch Jetty das. (Schon 2006 war zu lesen: "patch to allow Jetty to use JSP2.1 from Glassfish instead of Jasper from Tomcat"). Von GlassFish geht im Moment ein sehr starker Zug aus und es bleibt sehr spannend.

MouseScrollableUI für JXLayer

Browser haben mich zum ersten Mal auf ein Gui-Feature aufmerksam gemacht, das folgender Screenshot am Besten erklärt:

demo screenshot

In der Tabelle erkennt man ein Symbol, mit dem sich leicht durch große Views scrollen lässt. Aktiviert wird diese Möglichkeit über die mittlere Maustaste.

Nun ist so etwas auch einfach für Swing über einen Dekorator möglich:

JScrollPane sp = JScrollPane( table );
JXLayer<JScrollPane> lsp = new JXLayer<JScrollPane>( sp, new MouseScrollableUI() );
container.add( lsp );

Thema der Woche: Refactoring

Refactoring von Code ist eine wichtige Aufgabe von Entwicklern neben der Neuentwicklung von Programmcode. Die Pflege und Aufarbeitung darf natürlich nicht zum Selbstzweck werden, aber langlebige Software muss zwingend für immer die Kriterien Wartbarkeit und Erweiterbarkeit bewahren und gut dokumentiert und verständlich sein.

Den größten Einfluss auf das Thema Refactoring hat das Refactoring-Buch von Martin Fowler, der auf seiner Webseite das Prinzip Refactoring, Refactoring-Tools und News auflistet.

Martin Fowler hat mir erlaubt, seinen Refactoring-Katalog auf Deutsch zu übersetzen: http://www.tutego.com/java/refactoring/catalog/. Gehe kurz über alle Refactorings.

Moderne IDEs erlauben von Haus aus das Refactoring von Code. Im Fall von Eclipse finde zu jedem unterstützten Refactoring ein Beispiel und lasse es von Eclipse umbauen:

GWT 1.5 RC2

Bezug unter http://code.google.com/webtoolkit/download.html . Changelog unter http://code.google.com/webtoolkit/releases/release-notes-1.5.1.html#Release_Notes_Current . Grundsätzlich für GWT 1.5:

  • Java 1.5 Support
  • Compiler Enhancements to Improve Application Speed
  • UI Library Additions: Widget Animations, Visual Themes
  • DOM API for simplified DOM Programming
  • Internationalization Improvements: Bi-di, Pluralization
  • Accessibility Support
  • Enhancements to the JRE Emulation Library

Erster Java Closures Prototype im openjdk

Von http://gafter.blogspot.com/2008/08/java-closures-prototype-feature.html:

The complete source code, released under GPLv2, is in the project’s openjdk repository. A binary build, suitable for use with an existing JDK6, is at http://www.javac.info/closures.tar.gz. Other related documents are on the website http://www.javac.info/

Neu sind Method references aus dem  FCM proposal:

{ String => int } parseInt = Integer#parseInt(String);
int x = parseInt.invoke("42");

Damit wird es immer wahrscheinlicher, dass es Closures in Java 7 gibt, obwohl Zeitpunkt und Inhalte immer noch nicht feststehen.

VisualVM 1.0 + JDK Integration

VisualVM ist nun in der Version 1.0 final. Ein erstaunliche Neuerung ist, dass Sun VisualVM in das Update 7 von JDK 6 integriert hat; sonst wurden noch nie in Updates neue Tools integriert.

Die wichtigsten Features von der Webseite:

Display local and remote Java applications. VisualVM automatically detects and lists locally and remotely running Java applications (jstatd must be running on the remote host). You can also define applications manually by JMX connection. This way you can easily see what Java applications are running on your system or check if a remote J2EE server process is alive.


Display application configuration and runtime environment. For each application VisualVM shows basic runtime information: PID, main class, arguments passed to java process, JVM version, JDK home, JVM flags and arguments and system properties.


Monitor application memory consumption and runtime behavior. VisualVM monitors application heap and permanent generation memory, number of loaded classes and running threads. You can easily detect suspicious memory consumption and take an action – invoke garbage collection in the application or take a heap dump and browse the contents of application heap.


Monitor application threads. All threads running in a Java process are displayed in a timeline. You can track thread activity and uncover inefficient patterns like blocked Event Dispatch Thread or unused worker threads.


Profile application performance or analyze memory allocation. VisualVM has a built-in application profiler which can visualize where most of the time is being spent or which objects consume most of the memory by just one mouse click without any additional configuration.


Take and display thread dumps. Taking and displaying a thread dump is as easy as clicking a mouse button. You don’t need to deal with the command line at all to determine what’s currently happening in the application. Moreover, simultaneous thread dumps of multiple applications can be taken at once to start uncovering distributed deadlocks.


Take and browse heap dumps. When you need to browse contents of application memory or uncover a memory leak in your application, you’ll find the built-in HeapWalker tool really handy. It can read files written in hprof format and is also able to browse heap dumps created by the JVM on an OutOfMemoryException.


Analyze core dumps. When a Java process crashes, a core dump can be generated by the JVM containing important information about application state at the time of the crash. VisualVM is able to display application configuration and runtime environment and to extract thread and heap dumps from the core dump.


Analyze applications offline. VisualVM is able to save application configuration and runtime environment together with all taken thread dumps, heap dumps and profiler snaphots into a single application snapshot which can be later processed offline. This is especially useful for bug reports where users can provide a single file containing all the necessary information to identify runtime environment and application state.

Die Webseite sieht auch viel schicker aus (was für die anderen java.net-Projekte aber nicht gilt).

Werbung: Wir haben neue/aktualisierte Seminare.

Doclet APIviz für nette UML-Diagramme

APIviz ist ein LGPL-Doclet, welches nicht nur die klassische JavaDoc-API erstellt, sondern gleich dabei noch UML-Diagramme. Die Diagramme werden generiert von http://www.graphviz.org/.

Hier ein Beispiel, wie das nach dem Erzeugen aussieht:

net.gleamynode.netty.buffer
Class HeapChannelBuffer

java.lang.Object
extended by net.gleamynode.netty.buffer.AbstractChannelBuffer
extended by net.gleamynode.netty.buffer.HeapChannelBuffer

All Implemented Interfaces:
Comparable<ChannelBuffer>, ChannelBuffer
Direct Known Subclasses:
BigEndianHeapChannelBuffer, LittleEndianHeapChannelBuffer

public abstract class HeapChannelBuffer
extends AbstractChannelBuffer

http://netty.googlecode.com/svn/site/api/3.0/net/gleamynode/netty/buffer/HeapChannelBuffer.png

Version:
$Rev$, $Date$
Author:
The Netty Project (netty@googlegroups.com), Trustin Lee (trustin@gmail.com)

Thema der Woche: Rich Internet Applications mit OpenLaszlo und ZK

Statt wie bei vielen Java Web-Frameworks HTML-Seiten in das Zentrum zu stellen, gehen moderne RIA (Rich Internet Applications)-Frameworks einen anderen Weg. Im Mittelpunkt stehen dort XML-Dateien, die die View beschreiben, angereichert mit JavaScript für die Interaktion und das Ansprechen von Services in der Middle-Tier. Drei der bekannten Frameworks sind:

Verschaffe einen Eindruck über die Frameworks mit dem Demos http://www.zkoss.org/demo/, http://www.openlaszlo.org/showcase, http://www.webspiders.com/flex/.

http://www.openlaszlo.org/lps4/laszlo-explorer/index.jsp?lzr=dhtml bietet unter "Laszlo in 10 Minutes " einen Editor auf der einen Seite und eine Ansicht auf der anderen, so dass man über dem Editor, eigene Programme in der Mini-IDE schreiben kann. Entwickle auf diese Weise einen Umrechner von Euro in Dollar.

Installiere den OpenLaszlo Server (http://www.openlaszlo.org/lps4/docs/installation/). Setze den Euro/Dollar-Umrechner in das Verzeichnis. Schreibe eine einfache JSP (oder echten Web-Service über Java 6 wer will; angelehnt an http://rscreeney.wordpress.com/2006/09/19/laszlo-simple-web-service/), die als Service den aktuellen Umrechnugskurs liefert, worauf das eigene OpenLaslo-Programm zurückgreift. (Wer möchte, kann die Lösung gerne hier als Kommentar reinsetzen.)

Zwei Open-Source Bibs für Java ME Entwicklung

Wer für die Java ME entwickelt, der muss vieles selbst machen, da die CLDC/MIDP-Bibs doch relativ schwach sind. Zwei Open-Source Bibs, die dort Arbeit abnehmen können, sind:

  • kommons – JavaME reusable objects; hat nix mit KDE zu tun 🙂
    The goal of the project kommons is to provide a set of reusable objects useful to make networking, object persistence (Caching), logging, working with Strings (Iso, UTF8) and many more…
  • 59pixels Open Source J2ME Libraries
    Some of the libraries which 59Pixels have built up over the last year. Most of them are the first generation versions and are not as polished or as efficient as they could be but we have been able to distribute our products on over 150 handsets so I’m sure they will be useful to you.

Apache POI 3.1 final

Von http://poi.apache.org, der Open-Source Bib. zum Verarbeiten von MS Excel-, PowerPoint-, Visio- und Word-Dateien, gibt es eine neue Version. Änderungen sind unter anderem:

Highlights in POI-HSSF - Java API To Access Microsoft Excel Format Files:

  • Major improvements in formula evaluation
  • Support for conditional formatting
  • Support for Excel hyperlinks
  • Handling of embedded OLE2 documents
  • Support for getting excel cell comments when extracting text
  • Support for specifying a policy to HSSF on missing / blank cells when fetching

Highlights in POI-HSLF - Java API To Access Microsoft PowerPoint Format Files:

  • Support for getting embedded sounds
  • Support for getting embedded OLE objects
  • Support for Tables
  • Improved text extraction
  • Export PowerPoint slides into image
  • Java2D Graphics driver

Highlights in POI-HWPF - Java API To Access Microsoft Word Format Files

  • Handling of embedded OLE2 documents
  • Support for extracting Escher images from HWPF files
  • Improved Range.replaceText()

Ich bin gespannt, ob sich mit der MS-Initiative, Dokus anzubieten, die Bib. noch weiter und vollständiger entwickeln wird:

Thema der Woche: Collection-API-Erweiterungen

Die Java-Collection API bietet grundlegende Sammlungen, aber es gibt immer noch Bedarf an mehr. Drei Bibliotheken stechen hier besonders raus:

Lese etwas über die Projekte. Beantworte folgende Fragen:

  • Welche neuen Datenstrukturen enthalten Google Collections?
  • Welche Autoren arbeiten an Google Collections?
  • Welchen Sinn ergeben folgende Szenarien: new ReferenceMap(WEAK, STRONG), new ReferenceMap(WEAK, WEAK), new ReferenceMap(STRONG, STRONG)?
  • Was kann man mit der Apache-Klasse ExtendedProperties machen?
  • Wofür sind die Typen in org.apache.commons.collections.functors nötig und wie verwendet man sie ? Haben Transformer damit etwas zu tun?
  • Warum spricht Javolution an vielen Stellen von "hard real-time compliant"?
  • Bewerte den Benchmark http://javolution.org/doc/benchmark.html.

Open Source Docking Frameworks

http://lopeathal.wikispaces.com/Open+Source+Docking+Frameworks gibt einen Überblick über Docking-Frameworks:

Name Development Licens Size Comments
MyDoggy active LGPL only jar’s: 0.5 MB
NetBeans active CDDL/GPL 4.6 MB (platform.zip)
XUI active MPL 1.6 MB (XUI-jdk15.zip)
JDocking inactive CDDL 1.3 MB (v0.8.zip) the docking part
of netbeans
JRichClient active GPL heavy development derivation of flexdock
FlexDock inactive community although
there is a new version (bugfix)
MIT only jar’s: 0.5 MB
Sanaware active GPL or Commercial full zip 0.3MB
InfoNode last version January 2007 GPL
VL Docking one year old – inactive? CeCILL/GPL
Eclipse active CPL or EPL ? only swt (?)
Docking Frames active LGPL 2.1 0.7 MB

Thema der Woche: Collection-API

Die Collection-API enthält grundlegende Sammlungen für Listen, Kellerspeicher, Assoziativspeicher. Gehe über alle Operationen der folgenden Schnittstellen:

Finde je ein Beispiel für keySet(), retainAll(), toArray(), headSet().

Welche Implementierungseigenschaften haben die folgenden Klassen:

Fülle eine WeakHashMap mit sovielen neuen java.awt.Point-Objekten, bis es einen OutOfMemoryError gibt. Fange diesen ab und gib die Größe der WeakHashMap aus.

Laufe zum Verständnis der Implementierung folgende Szenerien im Debugger ab:

  • Ein Element wird in die HashMap eingefügt, dann erfragt.
  • In eine LinkedList bzw. ArrayList werden einige Elemente eingefügt, dann nach ihrer Position erfragt und gelöscht.

Buchkritik: Hardcore Java

Robert Simmons. O’Reilly. ISBN 0-596-00568-7. März 2004. 344 Seiten
Warum tut mir O’Reilly das an? Ich setze es ohne Bedenken auf Platz 1 in der Liste der Java-Bücher, die einen völlig verfehlten Titel tragen. Im Vorwort wird noch groß verkündet: „We’re talking about difficult but extremely powerful and useful programming techniques like reflection, advanced data modeling, advanced GUI design, and advanced aspects of JDO, EJB and XML-based web clients. This unique book reveals the true wizardry behind the complex and often-mysterious Java environment.“ und dann kommt nur Anfängerstoff und nix von JDO, EJB oder XML. Dafür umso mehr Kindergartenthemen: Jede Klasse ist von java.lang.Object abgeleitet, ein „if“ verträgt auch komplexe Anfragen mit ZWEI Bedingungen oder dass es einen ?-Operator gibt. Echt Hardcore! Des Weiteren deklariert Felder in umständlicher Syntax int[] AN_ARRAY = new int[] {1, 2, 3, 6, 9, 18, 36}; statt einfach nur int[] AN_ARRAY = {1, 2, 3, 6, 9, 18, 36}; Und schließlich 30 Seiten Auseinandersetzung von final. Die Namen der Color-Konstanten sind klein statt groß (gibt es „erst“ seit Java 1.4) geschrieben, und warum der Autor in dem Calendar-Beispiel ausdrücklich nach GMT fragt, ist ebenfalls sonderbar, denn für das Beispiel spielt das überhaupt keine Rolle:

private Date creationDate = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime( );

Im nächsten Kapitel über immutable kommt natürlich der Hinweis auf String (immutable) und Point, Date, StringBuffer (nicht immutable), aber wertvolle Hinweise, etwa das immutable-Typen die Entwicklung von multitheaded-Anwendungen massiv erleichtern und immutable Objekte gut in einen Pool passen (wie einige Wrapper-Objekte in Java 5) werden unter den Teppich gekehrt. Immerhin erwähnt er die Unmodified-Wrapper. Weiter zum nächsten Hardcore-Thema, der Collection-API. Mr. Simmons schreibt: „…code is an example of a good interface-based technique:“

public class SomeClass {
HashSet someSet = new HashSet( );
protected Set someMethod( ) {
return this.someSet;
}
}

Der Objekttyp von someSet sollte wohl Set statt HashSet sein. Und warum ist in dem Beispiel die Methode gerade protected? Und someSet paketsichtbar? Da steckt vermutlich Hardcore Java Design-Erfahrung im Code. Na ja, dann hakt das Kapitel noch mal eben alle Hardcode-Collection-Klassen ab. Dass Robert fail-fast von Iteratoren erklärt, ist super, aber dann der nächste Rückschlag bei set.add(new String("p->" + element)). Was soll denn das heißen? Das nächste Kapitel heißt Exception-Handling (in welchem Java-Einführungsbuch steht das bitte schön nicht?) und der Hinweis, dass finally eine gute Stelle ist, um Datenbankverbindungen zu schließen. Das folgende Kapitel ist noch viel härter. Es geht um innere Klassen. Jetzt ist es an der Zeit, sich jeden Satz ganz genau anzuschauen und sich hoch zu konzentrieren. Radio aus, Fernseher aus, Computer aus. Weiter zum nächsten Hammerthema – Konstanten und Internationalisierung. Dass Robert auch Klammern kennt, zeigt er in Anweisungen wie dieser:

double area = (Math.pow(radius, 2) * PI);

(Wie wäre es stattdessen einfach mit radius * radius * 2? Oder wollte er ein Beispiel für größtmöglichen Rechenaufwand leisten?) Um vielleicht ungenauen Pi-Belegungen von Sun über Math.PI vorzubeugen, ist es auch sinnvoller, gleich selbst PI vorzubelegen: public static final double PI = 3.141;. Ist viel viel besser! Im Kapitel werden auch Bit-Felder vorgestellt inklusive der Bit-Operatoren. Bei den anschließenden Aufzählungen und Konstanten-Objekten baut der Autor dann erst einmal das Java 5 enum nach, bis er schlussendlich im letzten Kapitel auch zu Java 5 kommt. Dann kommt aber doch noch ein interessanter Absatz über readResolve() bei der Serialisierung. Immerhin hat Robert verstanden, dass es Klassenlader gibt: „You may think that since the constant object is final and static, this will guarantee that only one instance of each constant object will be in memory. I used to think the same thing until I was blindsided by a vicious bug in a genetic research system.“ Impressive! Im 8. Kapitel geht’s um Datenmodellierung. Kein Java-Thema und auch nur ein paar Seiten. Der Ansatz: „Unterstreiche alle Nomen und du hast Klassen, unterstreiche alle Verben und du hast Methoden“ darf auch nicht fehlen. So hat Robert sicherlich große Enterprise Systeme modelliert. Kapitel 9 hat Reflection zum Thema und etwas zum java.beans Paket. Seine Lust, an alle möglichen finalen Variablen auch final dranzuschreiben, sinkt. Kapitel 10 kommt auf Proxies zu sprechen, und dass die bei CORBA und RMI vorkommen. Nachdem ein selbstgebauter Proxy sich vorstellen darf, kommt es doch noch zu Einsatz vom InvocationHandler/Proxy. Jetzt wird es langsam interessant. Kapitel 10 spricht von schwachen Referenzen. Er implementiert ein

public class WeakHashSet extends AbstractSet implements Set

(warum steht hier implements Set?) und schreibt einen Weak-Listener. Solch ein Konstrukt ist insbesondere in Swing-Anwendungen sehr nützlich, doch hier hätte ich den Hinweis gut gefunden, dass etwa die OpenIDE, also NetBeans, hier schon etwas anbietet. Wo jetzt andere „Hardcore“-Bücher einsteigen ist seines, oh schade, schon zu Ende. Das war eigentlich das letzte Kapitel! Denn Kapitel 12 ist das Abschlusskapitel mit Java 5 und geht auf die Neuerungen ein. Doch seien wir ehrlich: Harte Nüsse wie Generics lassen wir uns viel lieber von einem echten Crack, von Joshua Bloch, in seinem Buch erklären. Dann müssen wir uns nicht Beispiele wie dieses hier anschauen:

class SomeClass<Type> {
Type value = null;
public Type getValue() {
return this.value();
}
public void setValue(final Type value) {
this.value = value;
}
}

Typvariablen sollten immer nur aus einzelnen Großbuchstaben bestehen. Bei einer Deklaration wie Type getValue() sieht sonst Type wie ein ordinären Java-Typ aus. Und warum wird value mit null initialisiert. Das ist doch klar, dass die JVM das mit null belegt. Was zeigt das Buch? Immerhin das O’Reilly den Mut hat, die schlechten Bewertungen auf der Webseite stehen zu lassen und nicht zu löschen. Meine Hochachtung. Bei Amazon sind die Bewertungen aber noch ehrlicher. Mut wird O’Reilly erst dann wirklich beweisen, wenn sie a) den Titel umformulieren, b) sich einen neuen Autor suchen, der das Buch umschreibt bzw. erweitert oder c) – die beste Option für jetzt – das Buch aus dem Sortiment nimmt. 4 Jahre nach Erscheinen wird’s Zeit dafür.

Buchkritik: JavaScript: The Good Parts

Douglas Crockford. O’Reilly. ISBN 978-0-596-51774-8. Mai 2008. 170 Seiten

In meinem Alltag habe ich wenig mit JavaScript zu tun (von meinem Visual Foxpro nach JavaScript-Konverter einmal abgesehen), sodass mir das Buch gerade recht kam, um meine JavaScript-Kenntnisse zu vertiefen. Es ist sicherlich nicht für absolute Anfänger geschrieben, doch für Leser mit Grundkenntnissen gut geeignet, tiefer in die Sprache einzusteigen. Techniken wie den Prototyp-Ansatz der Objektorientierung beschreibt Douglas sehr genau, sicherlich etwas zu detailliert für diejenigen, die nur  mal eben" JavaScript für die Webseite einsetzen möchten. (HTML und DOM spielen kaum eine Rolle. JavaScript wird eher als allgemeine Programmiersprache behandelt und weniger als  Webseitensprache".) In seine Beispielen finde ich teilweise den Rückgriff auf Variablen und Methoden aus vorangehenden Beispielen etwas irritierend. Zum Beispiel kommt seine selbstgebaute beget()-Funktion immer wieder vor, doch ohne einen Verweis für Leser, die erst in der Mitte einsteigen und diese Funktion nicht kennen. Seiner Argumentation beim Inkrement-/Dekrement-Operator ++, –, "In my own practice, I observed that when I used ++ and –, my code tended to be too tight, too tricky, too cryptic. So, as a matter of discipline, I don’t use them any more. I think that as a result, my coding style has become cleaner." bei den Bad-Parts kann ich nicht folgen, doch sonst erscheinen mit die Bad- und Awfull-Parts recht sinnvoll ausgewählt. Der
Unterschied zwischen == und === enthält tolle Beispiele; Begründungen für die Auswertung wären allerdings schön.

'' == '0'          // false 
0 == ''            // true
0 == '0'           // true
false == 'false'   // false
false == '0'       // true
false == undefined // false
false == null      // false
null == undefined  // true
' \t\r\n ' == 0    // true

Im Anhang stellt der Autor JSLint vor, ein Tool zum Testen der Codequalität von JavaScript-Programmen. Das ist zwar nett, doch hätte

ich freie JavaScript-Bibliotheken (wie etwa Prototype) lieber gesehen. Das Kapitel 4 (Functions) gibt’s online.