<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-18862554</id><updated>2008-07-03T23:05:45.339+02:00</updated><title type='text'>Java ist auch eine Insel</title><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default?start-index=26&amp;max-results=25'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>222</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18862554.post-2718720922846671099</id><published>2008-07-03T10:25:00.001+02:00</published><updated>2008-07-03T10:25:06.083+02:00</updated><title type='text'>Sehr interessanter Java/C-Benchmark</title><content type='html'>&lt;p&gt;Stefan hat unter &lt;a title="http://www.stefankrause.net/wp/?p=9" href="http://www.stefankrause.net/wp/?p=9"&gt;http://www.stefankrause.net/wp/?p=9&lt;/a&gt; die Ausf&amp;#252;hrungszeit von Programme mit unterschiedliche JVMs und C-Compilern getestet. Zwar misst er keine OOP-Eigenschaften, wie die Heap-Allokation, GC oder Kosten f&amp;#252;r dynamisch gebundene Methodenaufrufe, aber eben die Effizient f&amp;#252;r Low-Level-Operationen. Gut zu sehen, dass Java auch da schon extrem gut mithalten kann. Ich h&amp;#228;tte die Performance bei arithmetischen Operationen gar nicht so gut eingesch&amp;#228;tzt. Im Endeffekt gibt es folgendes Ergebnis:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Der GCC-Compiler und die C-Programme sind in der Regel am Schnellsten. Mal ist Suns JVM sogar schneller.&lt;/li&gt;    &lt;li&gt;Der native-Compiler JET von Excelsior bringt ausgezeichnete Ergebnisse (Platz 2).&lt;/li&gt;    &lt;li&gt;Der oft gepriesene C-Compiler LLVM ist nicht so gut wie gedacht.&lt;/li&gt;    &lt;li&gt;Die Performance von Suns JVM schwankt stark. Mal ist sie ausgezeichnet im Gewinnerfeld, mal weit abgeschlagen in der absoluten Verliererzone.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Praxisrelevant sind diese Benchmarks nur zum Teil. Jetzt ist es interessant zu wissen, wie OOP-Eigenschaften vom C++-Compiler oder von JET umgesetzt werden.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/07/sehr-interessanter-javac-benchmark.html' title='Sehr interessanter Java/C-Benchmark'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=2718720922846671099' title='1 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2718720922846671099'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2718720922846671099'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-8621500100744147176</id><published>2008-07-02T12:04:00.001+02:00</published><updated>2008-07-02T12:04:03.238+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Zwei Open-Source Bibs für Java ME Entwicklung</title><content type='html'>&lt;p&gt;Wer f&amp;#252;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&amp;#246;nnen, sind:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="https://kommons.dev.java.net/"&gt;kommons - JavaME reusable objects&lt;/a&gt;; hat nix mit KDE zu tun :-)      &lt;br /&gt;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...&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.59pixels.com/"&gt;59pixels Open Source J2ME Libraries&lt;/a&gt;      &lt;br /&gt;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.&lt;/li&gt; &lt;/ul&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/07/zwei-open-source-bibs-fr-java-me.html' title='Zwei Open-Source Bibs für Java ME Entwicklung'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=8621500100744147176' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/8621500100744147176'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/8621500100744147176'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2950909739372505158</id><published>2008-07-02T11:58:00.001+02:00</published><updated>2008-07-02T11:58:32.079+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Apache POI 3.1 final</title><content type='html'>&lt;p&gt;Von &lt;a href="http://poi.apache.org"&gt;http://poi.apache.org&lt;/a&gt;, der Open-Source Bib. zum Verarbeiten von MS Excel-, PowerPoint-, Visio- und Word-Dateien, gibt es eine neue Version. &lt;a href="http://java.dzone.com/announcements/apache-poi-31-final-released"&gt;&amp;#196;nderungen&lt;/a&gt; sind unter anderem:&lt;/p&gt;  &lt;pre&gt;Highlights in POI-HSSF - Java API To Access Microsoft Excel Format Files:&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Major improvements in formula evaluation &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Support for conditional formatting &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Support for Excel hyperlinks &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Handling of embedded OLE2 documents &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Support for getting excel cell comments when extracting text &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Support for specifying a policy to HSSF on missing / blank cells when fetching&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Highlights in  POI-HSLF - Java API To Access Microsoft PowerPoint Format Files:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Support for getting embedded sounds &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Support for getting embedded OLE objects &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Support for Tables &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Improved text extraction &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Export PowerPoint slides into image &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Java2D Graphics driver&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Highlights in POI-HWPF - Java API To Access Microsoft Word Format Files&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Handling of embedded OLE2 documents &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Support for extracting Escher images from HWPF files &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Improved Range.replaceText()&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ich bin gespannt, ob sich mit der MS-Initiative, Dokus anzubieten, die Bib. noch weiter und vollst&amp;#228;ndiger entwickeln wird:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://www.heise.de/newsticker/Microsoft-legt-Dokumentationen-zu-Dateiformaten-und-Protokollen-vor--/meldung/110253"&gt;Microsoft legt Dokumentationen zu Dateiformaten und Protokollen vor&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/07/apache-poi-31-final.html' title='Apache POI 3.1 final'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=2950909739372505158' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2950909739372505158'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2950909739372505158'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-5394650575573606414</id><published>2008-06-27T09:15:00.001+02:00</published><updated>2008-06-27T09:15:50.827+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Eclipse 3.4 (Eclipse Ganymede) fertig</title><content type='html'>&lt;p&gt;Seit dem 17. Juni kann man Eclipse 3.4 &lt;a href="http://ganymede-mirror1.eclipse.org/eclipse/downloads/"&gt;laden&lt;/a&gt;. Die &lt;a href="http://www.eclipse.org/downloads/packages/"&gt;Eclipse Ganymede Packages&lt;/a&gt; sind auch aktuell etwa mit der &lt;b&gt;&lt;a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/R/eclipse-jee-ganymede-win32.zip"&gt;Eclipse IDE for Java EE Developers&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;Und wie geht's nun weiter? Planungen laufen f&amp;#252;r Eclipse 4.0, was auch unter dem Namen e4 l&amp;#228;uft. Einige Links dazu:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://it-republik.de/jaxenter/news/Eine-Preview-auf-Eclipse-4.0-043598.html" href="http://it-republik.de/jaxenter/news/Eine-Preview-auf-Eclipse-4.0-043598.html"&gt;http://it-republik.de/jaxenter/news/Eine-Preview-auf-Eclipse-4.0-043598.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://wiki.eclipse.org/E4" href="http://wiki.eclipse.org/E4"&gt;http://wiki.eclipse.org/E4&lt;/a&gt; mit Unterlinks&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Interessant d&amp;#252;rfe &lt;a href="http://www.eclipse.org/rap/"&gt;Rich Ajax Platform (RAP)&lt;/a&gt; werden, eine M&amp;#246;glichkeit, mehr oder weniger direkt die SWT-Anwendungen &amp;#252;ber ein Ajax-Framework ins Web zu setzen.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/06/eclipse-34-eclipse-ganymede-fertig.html' title='Eclipse 3.4 (Eclipse Ganymede) fertig'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=5394650575573606414' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/5394650575573606414'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/5394650575573606414'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2898760820657416575</id><published>2008-06-25T09:46:00.001+02:00</published><updated>2008-06-25T09:46:25.357+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Die wöchentliche Dosis Java'/><title type='text'>Thema der Woche: Collection-API-Erweiterungen</title><content type='html'>&lt;p&gt;Die Java-Collection API bietet grundlegende Sammlungen, aber es gibt immer noch Bedarf an mehr. Drei Bibliotheken stechen hier besonders raus:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://code.google.com/p/google-collections/" href="http://code.google.com/p/google-collections/"&gt;http://code.google.com/p/google-collections/&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://commons.apache.org/collections/" href="http://commons.apache.org/collections/"&gt;http://commons.apache.org/collections/&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://javolution.org/" href="http://javolution.org/"&gt;http://javolution.org/&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Lese etwas &amp;#252;ber die Projekte. Beantworte folgende Fragen:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Welche neuen Datenstrukturen enthalten Google Collections?&lt;/li&gt;    &lt;li&gt;Welche Autoren arbeiten an Google Collections?&lt;/li&gt;    &lt;li&gt;Welchen Sinn ergeben folgende Szenarien: new ReferenceMap(WEAK, STRONG), new ReferenceMap(WEAK, WEAK), new ReferenceMap(STRONG, STRONG)?&lt;/li&gt;    &lt;li&gt;Was kann man mit der Apache-Klasse ExtendedProperties machen?&lt;/li&gt;    &lt;li&gt;Wof&amp;#252;r sind die Typen in org.apache.commons.collections.functors n&amp;#246;tig und wie verwendet man sie ? Haben Transformer damit etwas zu tun?&lt;/li&gt;    &lt;li&gt;Warum spricht Javolution an vielen Stellen von &amp;quot;hard real-time compliant&amp;quot;?&lt;/li&gt;    &lt;li&gt;Bewerte den Benchmark &lt;a title="http://javolution.org/doc/benchmark.html" href="http://javolution.org/doc/benchmark.html"&gt;http://javolution.org/doc/benchmark.html&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/06/thema-der-woche-collection-api_25.html' title='Thema der Woche: Collection-API-Erweiterungen'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=2898760820657416575' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2898760820657416575'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2898760820657416575'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-5849447549017392672</id><published>2008-06-24T14:32:00.001+02:00</published><updated>2008-06-24T14:32:33.594+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Insel'/><title type='text'>Inselupdate: instanceof mit Class-Objekten, isInstance() und isAssignableFrom</title><content type='html'>&lt;p&gt;Der bin&amp;#228;ren Operator instanceof testet, ob ein Objekt Exemplar einer Klasse oder der Oberklasse ist. Wenn das Ergebnis wahr ist, l&amp;#228;sst sich das Objekt unter dem gegeben Typen ansprechen, ist also zu-weisungskompatibel. Der rechte Operator bei instanceof, der Typname, muss jedoch immer zur &amp;#220;bersetzungszeit bekannt sein und kann nicht dynamisch, etwa durch eine String, festgelegt werden.&lt;/p&gt;  &lt;p&gt;Ist der Typname zur Compilerzeit vielleicht unbekannt, kann das Class-Objekt helfen. Die Methode isInstance(Object) ist sozusagen ein dynamisches instanceof. Gilt mit dem Operator&lt;/p&gt;  &lt;p&gt;object instanceof ReferenceType&lt;/p&gt;  &lt;p&gt;So hei&amp;#223;t das mit der Methode&lt;/p&gt;  &lt;p&gt;ReferenceType-Class-Objekt.isInstance( object )&lt;/p&gt;  &lt;p&gt;Gew&amp;#246;hungsbed&amp;#252;rftig ist sicherlich die Tatsache, dass bei der Methode isInstance() die beiden Operanden umgedreht sind. Dazu ein paar Beispiele:&lt;/p&gt;  &lt;p&gt;Component b = new JLabel();   &lt;br /&gt;out.println( b instanceof JLabel );&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // true    &lt;br /&gt;out.println( JLabel.class.isInstance( b ) );&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // true    &lt;br /&gt;out.println( Object.class.isInstance( b ) );&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // true    &lt;br /&gt;out.println( Class.forName(&amp;quot;java.awt.Component&amp;quot;).isInstance( b ) );&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // true    &lt;br /&gt;out.println( String.class.isInstance( b ) );&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // false&lt;/p&gt;  &lt;p&gt;Die Methode isInstance(object) ist nat&amp;#252;rlich ein wenig eingeschr&amp;#228;nkt dadurch, dass es immer ein Test-Objekt geben muss. Die Frage etwa, ob das Class-Objekt der Schnittstelle PublicKey eine ist-eine-Art von Serializable ist, kann isInstance(object) nicht beantworten, denn dann m&amp;#252;sste es vorher ein Objekt geben. F&amp;#252;r diesen Fall bietet das Class-Objekt noch eine zweite Funktion: isAs-signableFrom(Class).&lt;/p&gt;  &lt;p&gt;Class&amp;lt;?&amp;gt; clazz = Serializable.class;   &lt;br /&gt;out.println( clazz.isAssignableFrom( String.class ) );&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // true    &lt;br /&gt;out.println( clazz.isAssignableFrom( Thread.class ) );&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // false    &lt;br /&gt;out.println( clazz.isAssignableFrom( PublicKey.class ) );&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // true&lt;/p&gt;  &lt;p&gt;Solange der Typname zur &amp;#220;bersetzungszeit bekannt ist, ist instanceof immer noch die beste L&amp;#246;sung. Doch wenn die Klasse nur durch ein Class-Objekt gegeben ist, bleibt immer noch isAssignableFrom(). Die Methode clazz.isInstance(obj) ist sozusagen eine Kurzform von clazz.isAssignableFrom(obj.getClass()).&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/06/inselupdate-instanceof-mit-class.html' title='Inselupdate: instanceof mit Class-Objekten, isInstance() und isAssignableFrom'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=5849447549017392672' title='3 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/5849447549017392672'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/5849447549017392672'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-3159664524738758883</id><published>2008-06-16T13:51:00.001+02:00</published><updated>2008-06-16T13:51:01.819+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><title type='text'>Open Source Docking Frameworks</title><content type='html'>&lt;p&gt;&lt;a title="http://lopeathal.wikispaces.com/Open+Source+Docking+Frameworks" href="http://lopeathal.wikispaces.com/Open+Source+Docking+Frameworks"&gt;http://lopeathal.wikispaces.com/Open+Source+Docking+Frameworks&lt;/a&gt; gibt einen &amp;#220;berblick &amp;#252;ber Docking-Frameworks:&lt;/p&gt;  &lt;table class="wiki_table"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Development&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Licens&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Size&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Comments&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="http://mydoggy.sourceforge.net/" rel="nofollow"&gt;MyDoggy&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;active         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;LGPL         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;only jar's: 0.5 MB         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="http://www.netbeans.org/" rel="nofollow"&gt;NetBeans&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;active         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;CDDL/GPL         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;4.6 MB (platform.zip)         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="http://xui.sourceforge.net/wikka/wikka.php?wakka=DockingFramework%20" rel="nofollow"&gt;XUI&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;active         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;MPL         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;1.6 MB (XUI-jdk15.zip)         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="https://jdocking.dev.java.net" rel="nofollow"&gt;JDocking&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;inactive         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;CDDL         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;1.3 MB (v0.8.zip)         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;the docking part         &lt;br /&gt;of netbeans          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="http://www.jrichclient.org" rel="nofollow"&gt;JRichClient&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;active         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;GPL         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;heavy development         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;derivation of flexdock         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="https://flexdock.dev.java.net/" rel="nofollow"&gt;FlexDock&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;inactive community although         &lt;br /&gt;there is a new version (bugfix)          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;MIT         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;only jar's: 0.5 MB         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="http://www.javadocking.com/" rel="nofollow"&gt;Sanaware&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;active         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;GPL or Commercial         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;full zip 0.3MB         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="http://sourceforge.net/projects/infonode/" rel="nofollow"&gt;InfoNode&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;last version January 2007         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;GPL         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="http://www.vlsolutions.com/en/products/docking/index.php" rel="nofollow"&gt;VL Docking&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;one year old - inactive?         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;CeCILL/GPL         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="http://www.eclipse.org/" rel="nofollow"&gt;Eclipse&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;active         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;CPL or EPL         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;?         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;only swt (?)         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a class="wiki_link_ext" href="http://dock.javaforge.com" rel="nofollow"&gt;Docking Frames&lt;/a&gt;          &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;active         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;LGPL 2.1         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;0.7 MB         &lt;br /&gt;&lt;/td&gt;        &lt;td&gt;         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/06/open-source-docking-frameworks.html' title='Open Source Docking Frameworks'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=3159664524738758883' title='3 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/3159664524738758883'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/3159664524738758883'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7893260800760374772</id><published>2008-06-16T13:05:00.001+02:00</published><updated>2008-06-16T13:05:36.188+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Die wöchentliche Dosis Java'/><title type='text'>Thema der Woche: Collection-API</title><content type='html'>&lt;p&gt;Die Collection-API enth&amp;#228;lt grundlegende Sammlungen f&amp;#252;r Listen, Kellerspeicher, Assoziativspeicher. Gehe &amp;#252;ber alle Operationen der folgenden Schnittstellen:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/Collection.html" href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/Collection.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/List.html" href="http://java.sun.com/javase/6/docs/api/java/util/List.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/List.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/Queue.html" href="http://java.sun.com/javase/6/docs/api/java/util/Queue.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/Queue.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/Set.html" href="http://java.sun.com/javase/6/docs/api/java/util/Set.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/Set.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/Map.html" href="http://java.sun.com/javase/6/docs/api/java/util/Map.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/Map.html&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Finde je ein Beispiel f&amp;#252;r keySet(), retainAll(), toArray(), headSet().&lt;/p&gt;  &lt;p&gt;Welche Implementierungseigenschaften haben die folgenden Klassen:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html" href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/HashSet.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/TreeSet.html" href="http://java.sun.com/javase/6/docs/api/java/util/TreeSet.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/TreeSet.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html" href="http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html" href="http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html" href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html" href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArraySet.html" href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArraySet.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArraySet.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html" href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentSkipListSet.html" href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentSkipListSet.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentSkipListSet.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/EnumMap.html" href="http://java.sun.com/javase/6/docs/api/java/util/EnumMap.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/EnumMap.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/HashMap.html" href="http://java.sun.com/javase/6/docs/api/java/util/HashMap.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/HashMap.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/IdentityHashMap.html" href="http://java.sun.com/javase/6/docs/api/java/util/IdentityHashMap.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/IdentityHashMap.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/LinkedHashMap.html" href="http://java.sun.com/javase/6/docs/api/java/util/LinkedHashMap.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/LinkedHashMap.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html" href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://java.sun.com/javase/6/docs/api/java/util/WeakHashMap.html" href="http://java.sun.com/javase/6/docs/api/java/util/WeakHashMap.html"&gt;http://java.sun.com/javase/6/docs/api/java/util/WeakHashMap.html&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;F&amp;#252;lle eine WeakHashMap mit sovielen neuen java.awt.Point-Objekten, bis es einen OutOfMemoryError gibt. Fange diesen ab und gib die Gr&amp;#246;&amp;#223;e der WeakHashMap aus.&lt;/p&gt;  &lt;p&gt;Laufe zum Verst&amp;#228;ndnis der Implementierung folgende Szenerien im Debugger ab:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ein Element wird in die HashMap eingef&amp;#252;gt, dann erfragt.&lt;/li&gt;    &lt;li&gt;In eine LinkedList bzw. ArrayList werden einige Elemente eingef&amp;#252;gt, dann nach ihrer Position erfragt und gel&amp;#246;scht.&lt;/li&gt; &lt;/ul&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/06/thema-der-woche-collection-api.html' title='Thema der Woche: Collection-API'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=7893260800760374772' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7893260800760374772'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7893260800760374772'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-772854259347041128</id><published>2008-06-11T13:52:00.002+02:00</published><updated>2008-06-12T16:23:05.882+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rezension'/><title type='text'>Buchkritik: Hardcore Java</title><content type='html'>&lt;p&gt;&lt;i&gt;Robert Simmons. O'Reilly. ISBN 0-596-00568-7. März 2004. 344 Seiten&lt;/i&gt;   &lt;br /&gt;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 &lt;code&gt;int[] AN_ARRAY = new int[] {1, 2, 3, 6, 9, 18, 36}; &lt;/code&gt;statt einfach nur &lt;code&gt;int[] AN_ARRAY = {1, 2, 3, 6, 9, 18, 36};&lt;/code&gt; 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:&lt;/p&gt;&lt;pre class="prettyprint"&gt;private Date creationDate = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime( );&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;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:“ &lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;public class SomeClass {&lt;br /&gt; HashSet someSet = new HashSet( );&lt;br /&gt; protected Set someMethod( ) {&lt;br /&gt;   return this.someSet;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;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 &lt;code&gt;set.add(new String("p-&amp;gt;" + element))&lt;/code&gt;. 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:&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;double area = (Math.pow(radius, 2) * PI);&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;(Wie wäre es stattdessen einfach mit &lt;code&gt;radius * radius * 2&lt;/code&gt;? Oder wollte er ein Beispiel für größtmöglichen Rechenaufwand leisten?) Um vielleicht ungenauen Pi-Belegungen von Sun über &lt;code&gt;Math.PI&lt;/code&gt; vorzubeugen, ist es auch sinnvoller, gleich selbst PI vorzubelegen: &lt;code&gt;public static final double PI = 3.141;&lt;/code&gt;. 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&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;public class WeakHashSet extends AbstractSet implements Set&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;(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 &lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/ref=pd_sim_b_title_4"&gt;Joshua Bloch, in seinem Buch&lt;/a&gt; erklären. Dann müssen wir uns nicht Beispiele wie dieses hier anschauen: &lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;class SomeClass&amp;lt;Type&amp;gt; {&lt;br /&gt; Type value = null;&lt;br /&gt; public Type getValue() {&lt;br /&gt;   return this.value();&lt;br /&gt; }&lt;br /&gt; public void setValue(final Type value) {&lt;br /&gt;   this.value = value;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;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 &lt;a href="http://oreilly.com/catalog/9780596005689/"&gt;Webseite&lt;/a&gt; stehen zu lassen und nicht zu löschen. Meine Hochachtung. Bei &lt;a href="http://www.amazon.com/Hardcore-Java-Robert-Simmons/dp/0596005687"&gt;Amazon&lt;/a&gt; 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.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/06/buchkritik-hardcore-java.html' title='Buchkritik: Hardcore Java'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=772854259347041128' title='4 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/772854259347041128'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/772854259347041128'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-4752769507327982291</id><published>2008-06-10T08:56:00.001+02:00</published><updated>2008-06-10T08:56:10.305+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rezension'/><title type='text'>Buchkritik: JavaScript: The Good Parts</title><content type='html'>&lt;p&gt;&lt;em&gt;Douglas Crockford. O'Reilly. ISBN 978-0-596-51774-8. Mai 2008. 170 Seiten&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;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&amp;#252;r absolute Anf&amp;#228;nger geschrieben, doch f&amp;#252;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&amp;#252;r diejenigen, die nur&amp;#160; mal eben&amp;quot; JavaScript f&amp;#252;r die Webseite einsetzen m&amp;#246;chten. (HTML und DOM spielen kaum eine Rolle. JavaScript wird eher als allgemeine Programmiersprache behandelt und weniger als&amp;#160; Webseitensprache&amp;quot;.) In seine Beispielen finde ich teilweise den R&amp;#252;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&amp;#252;r Leser, die erst in der Mitte einsteigen und diese Funktion nicht kennen. Seiner Argumentation beim Inkrement-/Dekrement-Operator ++, --, &amp;quot;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.&amp;quot; bei den Bad-Parts kann ich nicht folgen, doch sonst erscheinen mit die Bad- und Awfull-Parts recht sinnvoll ausgew&amp;#228;hlt. Der    &lt;br /&gt;Unterschied zwischen == und === enth&amp;#228;lt tolle Beispiele; Begr&amp;#252;ndungen f&amp;#252;r die Auswertung w&amp;#228;ren allerdings sch&amp;#246;n.&lt;/p&gt;  &lt;pre&gt;'' == '0'&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // false &lt;br /&gt;0 == ''&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // true &lt;br /&gt;0 == '0'&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // true &lt;br /&gt;false == 'false'&amp;#160;&amp;#160; // false &lt;br /&gt;false == '0'&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // true &lt;br /&gt;false == undefined // false &lt;br /&gt;false == null&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // false &lt;br /&gt;null == undefined&amp;#160; // true &lt;br /&gt;' \t\r\n ' == 0&amp;#160;&amp;#160;&amp;#160; // true&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Im Anhang stellt der Autor JSLint vor, ein Tool zum Testen der Codequalit&amp;#228;t von JavaScript-Programmen. Das ist zwar nett, doch h&amp;#228;tte &lt;br /&gt;  &lt;br /&gt;ich freie JavaScript-Bibliotheken (wie etwa &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;) lieber gesehen. Das Kapitel 4 (&lt;a href="http://www.oreilly.com/catalog/9780596517748/chapter/ch04.pdf"&gt;Functions&lt;/a&gt;) gibt's online.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/06/buchkritik-javascript-good-parts.html' title='Buchkritik: JavaScript: The Good Parts'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=4752769507327982291' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4752769507327982291'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4752769507327982291'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-6791303819856217093</id><published>2008-06-09T23:21:00.001+02:00</published><updated>2008-06-09T23:21:21.594+02:00</updated><title type='text'>Was da wohl ein Moslem zu sagt, zu...</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;MeCCA_Vibrator? Beim iPhone steuert das MeCCA-Framework Audio, Bluetooth und sonstige Hardware.&lt;br/&gt;&lt;br/&gt;MeCCA_Vibrator *v = new MeCCA_Vibrator;&lt;br/&gt;v-&amp;gt;activate(1);&lt;br/&gt;usleep(DURATION);&lt;br/&gt;v-&amp;gt;deactivate();&lt;br/&gt;&lt;/div&gt;</content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/06/was-da-wohl-ein-moslem-zu-sagt-zu.html' title='Was da wohl ein Moslem zu sagt, zu...'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=6791303819856217093' title='2 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/6791303819856217093'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/6791303819856217093'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-3515159884448411885</id><published>2008-06-09T17:09:00.001+02:00</published><updated>2008-06-09T17:09:57.599+02:00</updated><title type='text'>JavaOne Sessions 2008 online</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Unter http://developers.sun.com/learning/javaoneonline/j1online.jsp?track=coolstuff&amp;amp;yr=2008 sind die Folien der JavaOne abgelegt.&lt;br/&gt;&lt;/div&gt;</content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/06/javaone-sessions-2008-online.html' title='JavaOne Sessions 2008 online'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=3515159884448411885' title='1 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/3515159884448411885'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/3515159884448411885'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-3144995153636840062</id><published>2008-05-31T21:47:00.001+02:00</published><updated>2008-05-31T21:47:58.088+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>PersistJS: Lokal im Browser Daten speichern</title><content type='html'>&lt;p&gt;Zust&amp;#228;nde von Web-Applikationen k&amp;#246;nnen, sofern sie klein sind, im Cookie gespeichert werden. Alles, was jedoch gr&amp;#246;&amp;#223;er als 4 KB ist, wird in der Regel auf der Serverseite abgelegt. Nun haben in den letzten Jahren die Browser-Hersteller lokale Speicherm&amp;#246;glichkeiten entwickelt:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;globalStorage: Firefox 2.0+, Internet Explorer 8 &lt;/li&gt;    &lt;li&gt;localStorage: development WebKit &lt;/li&gt;    &lt;li&gt;openDatabase: Safari 3.1+ &lt;/li&gt;    &lt;li&gt;userdata behavior: Internet Explorer 5.5+ &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Daneben gibt es Plugins, etwa von Google (Gears) oder Yahoo. Das dumme bei den Plugins ist jedoch, das diese extra installiert werden m&amp;#252;ssen. Ihr Vorteil allerdings: Eine standardisierte API. Doch damit kann nun Schluss sein. Mit &lt;a href="http://pablotron.org/?cid=1557"&gt;PersistJS&lt;/a&gt; gibt es eine standardisierte API, die von den jeweiligen Browser- und Plugin-APIs abstrahiert. Der Zugriff ist simpel&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;var store = new Persist.Store('Mein Data Store');&lt;br /&gt;var data = &amp;quot;Daten&amp;quot;;&lt;br /&gt;store.set('saved_data', data);&lt;br /&gt;&lt;/code&gt;&lt;code&gt;store.get('saved_data', function(ok, val) {&lt;br /&gt;  if (ok)&lt;br /&gt;    alert('saved data = ' + val);&lt;br /&gt;});&lt;br /&gt;&lt;/code&gt;&lt;code&gt;store.remove('saved_data');&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;PersistJS nutzt nun intern:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;flash: Flash 8 persistent storage. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;gears: Google Gears-based persistent storage. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;localstorage: HTML5 draft storage. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;whatwg_db: HTML5 draft database storage. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;globalstorage: HTML5 draft storage (old spec). &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;ie: Internet Explorer userdata behaviors. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;cookie: Cookie-based persistent storage.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/persistjs-lokal-im-browser-daten.html' title='PersistJS: Lokal im Browser Daten speichern'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=3144995153636840062' title='1 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/3144995153636840062'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/3144995153636840062'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-8597979305754668311</id><published>2008-05-29T21:59:00.001+02:00</published><updated>2008-05-29T21:59:28.553+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rezension'/><title type='text'>Buchkritik: Pro Netbeans IDE 6. Rich Client Platform Edition</title><content type='html'>&lt;p&gt;&lt;i&gt;Adam Myatt. Apress. ISBN 978-1-59059-895-5. Februar 2008, 491 Seiten&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Ein aktuelles Buch &amp;#252;ber NetBeans, welches auf grundlegende aber auch erweiterte Eigenschaften der Entwicklungsumgebung eingeht. Themen sind unter anderem Installation (das 1. Kapitel &amp;quot;Downloading, Installing, and Customizing NetBeans&amp;quot; ist auch &lt;a href="http://www.apress.com/book/downloadfile/3914"&gt;online&lt;/a&gt;), der Editor, Einstellungen, Projektangaben, Gui-Bilder, Debugging, Profiling, Versionsmanagement, JUnit, Refactoring, Datenbankbrowser, Qualit&amp;#228;tspr&amp;#252;fung. Dass das Buch auf der aktuellen Version 6 aufbaut, zeigt sich insbesondere an den letzten Kapiteln, in denen es JRuby und Rails, Web-Services, BPEL, REST, dem Swing-Application Framework und Beans Binding zur Sprache bringt. Dem Autor ist das Kapitel &amp;#252;ber Swing aber lieber gewesen, denn hier beschreibt er ausf&amp;#252;hrlicher die Technologie, w&amp;#228;hrend bei Web-Services nur Eintr&amp;#228;ge in den Dialogen aufgez&amp;#228;hlt werden, aber nicht erkl&amp;#228;rt wird, was diese eigentlich sollen. Aber das ist wohl immer der Fall, wenn ein Buch nur zeigen m&amp;#246;chte, WIE man mit der IDE etwas macht, aber nicht warum. F&amp;#252;r welche K&amp;#228;uferschicht das Buch am Besten geeignet ist, ist schwer zu beantworten. Erfahrene Entwickler, die schon einige IDEs kennengelernt haben (Eclipse, JDeveloper, ...) werden mit NetBeans keine Probleme haben. (Aus der Java-Community gibt es vielfach die Meinung, NetBeans ist viel einfacher zu bedienen als Eclipse.) Daher bekommt man mit etwas Rumklicken und aufmerksamem Lesen die meisten Sachen schnell raus, zumal die Webseite von Sun voll von Tutorials insbesondere f&amp;#252;r die fortgeschrittenen Themen ist. Wer ein Gesp&amp;#252;r f&amp;#252;r Entwicklungswerkzeuge hat, und gerne Online-Tutorials liest, wird mit &lt;a href="http://www.netbeans.org/kb/"&gt;http://www.netbeans.org/kb/&lt;/a&gt; auch gl&amp;#252;cklich. Zumal bei Sun Artikel zur Java ME-Entwicklung, C(++) oder UML-Modellierung stehen, die das Buch &amp;#252;berhaupt nicht ankratzt. Schade eigentlich, denn vermutlich d&amp;#252;rfte UML f&amp;#252;r die meisten Leser interessanter sein als einen BPEL-Web-Service auf Glassfish zu deployen. Das letzte Kapitel &amp;#8222;Developing Rich Client Applications&amp;#8220; hat aber nichts mit der Entwicklungsumgebung selbst zu tun, sondern stellt kurz das NetBeans RCP vor. Hier ist die Zielgruppe eine v&amp;#246;llig andere. Denn der Bediener einer IDE ist nicht unbedingt einer, der mit dem RCP Desktop-Anwendungen schreibt. Sehr fragw&amp;#252;rdig ist daher auch der Titel &amp;#8222; Rich Client Platform Edition&amp;#8220;; hier ist man verleitet anzunehmen, dass es ein Buch &amp;#252;ber das RCP-Framework ist. Doch nein, es ist nur ein Buch &amp;#252;ber die Bedienung einer Entwicklungsumgebung.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/buchkritik-pro-netbeans-ide-6-rich.html' title='Buchkritik: Pro Netbeans IDE 6. Rich Client Platform Edition'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=8597979305754668311' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/8597979305754668311'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/8597979305754668311'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-8109297963568075786</id><published>2008-05-28T10:30:00.001+02:00</published><updated>2008-05-28T10:30:29.613+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>JPA for Amazon SimpleDB 0.4-Update vom 20.4.</title><content type='html'>&lt;p&gt;Ein abgefahrendes Projekt ist eine JPA-Schnittstelle f&amp;#252;r die &lt;a href="http://en.wikipedia.org/wiki/Amazon_SimpleDB"&gt;Amazon SimpleDB&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Amazon_S3"&gt;Amazon S3 (Simple Storage Service)&lt;/a&gt;). Mit &lt;a href="http://code.google.com/p/simplejpa/"&gt;http://code.google.com/p/simplejpa/&lt;/a&gt; l&amp;#228;sst sich auf die Amazon-Datenbank &amp;#252;ber das standardisierte JPA zugreifen. Die Doku unter &lt;a title="http://code.google.com/p/simplejpa/wiki/GettingStarted" href="http://code.google.com/p/simplejpa/wiki/GettingStarted"&gt;http://code.google.com/p/simplejpa/wiki/GettingStarted&lt;/a&gt; listet alles n&amp;#246;tigen Jar-Dateien auf und zeigt anhand eines kleines Beispiels die Nutzung. Da die Amazon-DB keine &amp;quot;richtige&amp;quot; relationale DB ist, gibt es auch einige Einschr&amp;#228;nkungen, etwa &amp;quot;&lt;a&gt;Can only query on a single object type, no joins.&lt;/a&gt;&amp;quot; Auf der anderen Seite:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a&gt;Supports ManyToOne references with lazy loading &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a&gt;Supports OneToMany collections with lazy loading &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a&gt;Large object (LOB) support via Amazon S3 &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a&gt;Caches objects for quick response after first retrieval &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a&gt;Retrieves result sets concurrently for fastest retrieval from SimpleDB &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;JPA Queries (subset)&lt;/li&gt;    &lt;li&gt;&lt;a&gt;@ManyToOne - object references. Stores id reference to another object in another Domain &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a&gt;@OneToMany (java.util.List only, must be generified, must be bi-directional with mappedBy parameter) - Collection support. Please be careful with collections, usually better to just query for what you want rather than attaching via collections. &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a&gt;@Inheritance - Only SINGLE_TABLE supported (only one that makes sense). &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a&gt;@MappedSuperClass - Useful for a common ID and timestamping class. &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a&gt;@Lob - stores lobs in S3 so make it as big as you want (up to 5GB). &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a&gt;@Id - MUST be a string &lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a&gt;JPA Queries - see &lt;/a&gt;&lt;a href="http://code.google.com/p/simplejpa/wiki/JPAQuery"&gt;JPAQuery&lt;/a&gt; page &lt;/li&gt;    &lt;li&gt;Integer and Long - no problems, all good. &lt;/li&gt;    &lt;li&gt;Double - pads to 20 digits on each side of the decimal by default so fine for a lot of cases, but if you plan to use Double's, let us know so we can work it out perfectly. SimpleDB makes it hard to work with these numbers because it treats everything as a String. &lt;/li&gt;    &lt;li&gt;BigDecimal - same problems as Double &lt;/li&gt;    &lt;li&gt;String &lt;/li&gt;    &lt;li&gt;no primitives yet! Please use wrappers only for now. &lt;/li&gt;    &lt;li&gt;@Enumerated (ordinal and string) &lt;/li&gt;    &lt;li&gt;@Column (name only) &lt;/li&gt; &lt;/ul&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/jpa-for-amazon-simpledb-04-update-vom.html' title='JPA for Amazon SimpleDB 0.4-Update vom 20.4.'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=8109297963568075786' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/8109297963568075786'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/8109297963568075786'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2546405014868010332</id><published>2008-05-28T09:11:00.001+02:00</published><updated>2008-05-28T09:11:33.199+02:00</updated><title type='text'>William Pugh über Find Bugs</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Auf der Java One 2008 hat William Pugh den Vortrag &lt;a href="http://developers.sun.com/learning/javaoneonline/2008/pdf/TS-6589.pdf"&gt;Defective Java&amp;#8482; Code: Turning WTF code into a learning experience&lt;/a&gt; gehalten. In interessanten Beispielen geht er auf Synchronisation, Immutable und equals() ein. Insbesondere letztes ist sehr interessant und an guten Beispielen dokumentiert. (Die &lt;a href="http://www.galileocomputing.de/openbook/javainsel7/javainsel_09_002.htm#mja6aa77afda4646e4a0bf57680c447767"&gt;Insel&lt;/a&gt; geht ebenfalls das Problem der Symmetrie ein.)&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/william-pugh-ber-find-bugs.html' title='William Pugh über Find Bugs'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=2546405014868010332' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2546405014868010332'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2546405014868010332'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-8909972601810350628</id><published>2008-05-28T08:39:00.001+02:00</published><updated>2008-05-28T08:39:28.275+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Cargo: Automatisch Web-/JavaEE-Container starten/stoppen und Module Deployen</title><content type='html'>&lt;p&gt;&lt;a href="http://cargo.codehaus.org/"&gt;Cargo&lt;/a&gt; (von &lt;a href="http://blogs.codehaus.org/people/vmassol/"&gt;Vincent Massol&lt;/a&gt;) bietet Java-APIs sowie Ant und Maven Unterst&amp;#252;tzung, um Web- und Java EE-Container zu starten/stoppen und Module zu deployen. Die Liste der Server ist erst einmal toll: Geronimo, JBoss, Jetty, Resin, WebLogic, Tomcat (kein WebSphere!). So gut die Idee auch ist, leider ist das Projekt soweit &lt;a href="http://archive.codehaus.org/cargo/dev/1C2226ED-EB6B-4021-BF11-D4C926ECCACD%40massol.net"&gt;gestorben&lt;/a&gt;. Wer Lust hat, darf gerne project lead werden. Na ja, die letzte Version ist von 10/03/07 und bisher hat sich noch keiner gefunden.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/cargo-automatisch-web-javaee-container.html' title='Cargo: Automatisch Web-/JavaEE-Container starten/stoppen und Module Deployen'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=8909972601810350628' title='2 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/8909972601810350628'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/8909972601810350628'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-199372996478172592</id><published>2008-05-27T09:56:00.003+02:00</published><updated>2008-06-16T13:10:43.843+02:00</updated><title type='text'>Paket sun.jvmstat: Wie man selbst ein jps schreibt</title><content type='html'>&lt;p&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html"&gt;jps (Java Virtual Machine Process Status Tool)&lt;/a&gt; ist ein Utility, welches neu bei Java 5 ist. Es zeigt die aktuellen laufenden Java VM-Instanzen an.&lt;/p&gt;  &lt;br /&gt;&lt;pre&gt;$ jps &lt;br /&gt;2256 &lt;br /&gt;2960 Jps&lt;br /&gt;&lt;br /&gt;$ jps -mlvV &lt;br /&gt;1692 sun.tools.jps.Jps -mlvV -Dapplication.home=C:\Programme\Java\jdk1.6.0 -Xms8m &lt;br /&gt;2256  -Xbootclasspath/a:C:\PROGRA~1\Java\JRE16~1.0\lib\deploy.jar;C:\PROGRA~1\Java\JRE16~1.0\lib\plugin.jar -Xmx96m ...&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Um ein eigenes &lt;em&gt;jps&lt;/em&gt; zu schreiben ist, ist das Java-Archiv &lt;em&gt;tools.jar&lt;/em&gt; aus dem &lt;em&gt;lib&lt;/em&gt;-Verzeichnis des JDK im Klassenpfad n&amp;#246;tig. Dort gibt es das zentrale (interne!) Paket &lt;a href="http://www.openjdk.org/groups/serviceability/jvmstat/index.html"&gt;sun.jvmstat&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import java.util.Set;&lt;br /&gt;import sun.jvmstat.monitor.*;&lt;br /&gt;&lt;br /&gt;public class T&lt;br /&gt;{&lt;br /&gt; @SuppressWarnings(&amp;quot;unchecked&amp;quot;)&lt;br /&gt; public static void main( String[] args ) throws Exception&lt;br /&gt; {&lt;br /&gt;  MonitoredHost monitoredhost = MonitoredHost.getMonitoredHost( &amp;quot;//localhost&amp;quot; );&lt;br /&gt;  for ( int id : (Set&amp;lt;Integer&amp;gt;) monitoredhost.activeVms() ) {&lt;br /&gt;   VmIdentifier vmidentifier = new VmIdentifier( &amp;quot;&amp;quot; + id );&lt;br /&gt;   MonitoredVm monitoredvm = monitoredhost.getMonitoredVm( vmidentifier, 0 );&lt;br /&gt;   System.out.printf( &amp;quot;%d %s %s %s%n&amp;quot;, id,&lt;br /&gt;   MonitoredVmUtil.mainClass( monitoredvm, true ),&lt;br /&gt;   MonitoredVmUtil.jvmArgs( monitoredvm ),&lt;br /&gt;   MonitoredVmUtil.mainArgs( monitoredvm ) );&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Die Ausgabe ist&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;2984  -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m -XX:MaxPermSize=256M null &lt;br /&gt;360 T -Dfile.encoding=Cp1252 null &lt;br /&gt;2256  -Xbootclasspath/a:C:\PROGRA~1\Java\JRE16~1.0\lib\deploy.jar;C:\PROGRA~1\Java\JRE16~1.0\lib\plugin.jar -Xmx96m ...&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;N&amp;#252;tzlich kann das ganze sein, um etwa herauszufinden, ob schon ein Exemplar des aktuellen Programms l&amp;#228;uft. Denn das zweite Programm findet &amp;#252;ber mainClass() zweimal die gleiche Klasse.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/paket-sunjvmstat-wie-man-selbst-ein-jps.html' title='Paket sun.jvmstat: Wie man selbst ein jps schreibt'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=199372996478172592' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/199372996478172592'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/199372996478172592'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7159668156203958796</id><published>2008-05-26T11:36:00.001+02:00</published><updated>2008-05-26T11:36:21.235+02:00</updated><title type='text'>Spring-Framework gibt's nicht mehr</title><content type='html'>&lt;p&gt;&lt;a href="http://picasaweb.google.com/ullenboom/JavaKuriositTen/photo#5204617022053059122"&gt;&lt;img src="http://lh6.ggpht.com/ullenboom/SDqDmzdsijI/AAAAAAAAAFE/plP5LFG4014/s800/springframework.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Der &lt;a href="http://www.springframework.org/"&gt;Spring-Server&lt;/a&gt; hat heute schon den ganzen Vormittag Probleme...&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/spring-framework-gibt-nicht-mehr.html' title='Spring-Framework gibt&amp;#39;s nicht mehr'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=7159668156203958796' title='1 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7159668156203958796'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7159668156203958796'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-1153219858490804539</id><published>2008-05-26T11:29:00.001+02:00</published><updated>2008-05-26T11:29:05.601+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Die wöchentliche Dosis Java'/><title type='text'>Thema der Woche: Google Web Toolkit (GWT)</title><content type='html'>&lt;p&gt;Das &lt;b&gt;&lt;/b&gt;&lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit (GWT)&lt;/a&gt;&amp;#160; ist ein Web-Framework, mit einem interessanten Ansatz. Statt HTML-Seiten in den Vordergrund zu setzen, schreibt man Gui-Anwendungen in Java mit einer in AWT/Swing bekannten Art (Komponenten/Container und Listener) und l&amp;#228;sst diese Anwendung von einem Compiler in JavaScript &amp;#252;bersetzten. Die ganze Gui wird somit Teil des Web-Browers. F&amp;#252;r den Teil, der nicht im Browser l&amp;#228;uft, also die gesamte Gesch&amp;#228;ftslogik und Datenbank, gibt es eine RCP-Schnittstelle.&lt;/p&gt;  &lt;p&gt;Schaue drei Beispiele f&amp;#252;r die M&amp;#246;glichkeiten von GWT an.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://gwt.google.com/samples/KitchenSink/KitchenSink.html" href="http://gwt.google.com/samples/KitchenSink/KitchenSink.html"&gt;http://gwt.google.com/samples/KitchenSink/KitchenSink.html&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.gwt-ext.com/demo/" href="http://www.gwt-ext.com/demo/"&gt;http://www.gwt-ext.com/demo/&lt;/a&gt; (Der Quellcode der Beispiele ist verlinkt. Hier sollte man auch einen Blick drauf werfen.)&lt;/li&gt;    &lt;li&gt;&lt;a title="http://extjs.com/explorer/#overview" href="http://extjs.com/explorer/"&gt;http://extjs.com/explorer/&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Um etwas mehr vom Hintergrund zu verstehen, kann man &lt;a title="http://www.maximilien.org/presentations/2006/AJAX_and_GWT_Public_07052006.pdf" href="http://www.maximilien.org/presentations/2006/AJAX_and_GWT_Public_07052006.pdf"&gt;http://www.maximilien.org/presentations/2006/AJAX_and_GWT_Public_07052006.pdf&lt;/a&gt; lesen.&lt;/p&gt;  &lt;p&gt;Wer praktisch spielen m&amp;#246;chte, kann GWT+Eclipse+Plugin nach dem &lt;a href="http://www.tutego.com/blog/javainsel/2008/05/gwt-beispiel-in-eclipse.html"&gt;folgenden Blog-Eintrag&lt;/a&gt; installieren. Mehr &amp;#252;ber die Gui-Komponenten erf&amp;#228;hrt man in einem Kapitel des Hanser-Verlags (&amp;#220;bersetzung von GWT in Action): &lt;a href="http://files.hanser.de/hanser/docs/20070913_2791313535-39_978-3-446-41241-5_Leseprobe.pdf"&gt;Widgets (deutsch)&lt;/a&gt;.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/thema-der-woche-google-web-toolkit-gwt.html' title='Thema der Woche: Google Web Toolkit (GWT)'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=1153219858490804539' title='1 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/1153219858490804539'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/1153219858490804539'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7612292870896360592</id><published>2008-05-25T18:14:00.001+02:00</published><updated>2008-05-25T18:14:31.722+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>GWT-Beispiel in Eclipse</title><content type='html'>&lt;ol&gt;   &lt;li&gt;Beziehe &lt;a href="http://apache.mirror.iphh.net/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.zip"&gt;Tomcat 6.0&lt;/a&gt; und entpacke es. &lt;/li&gt;    &lt;li&gt;Beziehe GWT 1.5 (Noch in Vorbereitung f&amp;#252;r Java 5 Unterst&amp;#252;tzung): &lt;a title="http://code.google.com/p/google-web-toolkit/downloads/list?can=4&amp;amp;q=version:1.5" href="http://code.google.com/p/google-web-toolkit/downloads/list?can=4&amp;amp;q=version:1.5"&gt;http://code.google.com/p/google-web-toolkit/downloads/list?can=4&amp;amp;q=version:1.5&lt;/a&gt;. Gerade aktuelle Version: &lt;a href="http://google-web-toolkit.googlecode.com/files/gwt-windows-0.0.2415.zip"&gt;gwt-windows-0.0.2415.zip&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Lade &lt;em&gt;Eclipse IDE for Java EE Developers&lt;/em&gt; (&lt;a title="http://phoenix.eclipse.org/packages/" href="http://phoenix.eclipse.org/packages/"&gt;http://phoenix.eclipse.org/packages/&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;Beziehe Cypal Studio for GWT (&lt;a title="http://code.google.com/p/cypal-studio/downloads/list" href="http://code.google.com/p/cypal-studio/downloads/list"&gt;http://code.google.com/p/cypal-studio/downloads/list&lt;/a&gt;). Man packt das Eclipse-Plugin aus und setzt &lt;em&gt;features&lt;/em&gt; und &lt;em&gt;plugins&lt;/em&gt; in das &lt;em&gt;eclipse&lt;/em&gt;-Verzeichnis. &lt;/li&gt;    &lt;li&gt;Starte Eclipse &lt;/li&gt;    &lt;li&gt;Zwei Einstellungen unter &lt;strong&gt;Window &amp;gt; Preferences&lt;/strong&gt; sind vorzunehmen: 1) Installieren in Eclipse Tomcat 6.0. Gehe unter &lt;strong&gt;Server &amp;gt; Runtime Environment&lt;/strong&gt;, &lt;strong&gt;Add&lt;/strong&gt;, ... 2) GWT-Pfad einstellen: Bei &lt;strong&gt;Cypal Studio&lt;/strong&gt; das &lt;strong&gt;GWT Home &lt;/strong&gt;anpassen. &lt;/li&gt;    &lt;li&gt;Lege in Eclipse ein &lt;strong&gt;File &amp;gt; New &amp;gt; Other &amp;gt; Web &amp;gt; Dynamic Web Project&lt;/strong&gt; an. Unter &lt;strong&gt;Configuration&lt;/strong&gt; gehe auf &lt;strong&gt;Modify&lt;/strong&gt;. Setze ein H&amp;#228;kchen bei &lt;strong&gt;Cypal's GWT Facet&lt;/strong&gt;. Setze &lt;strong&gt;Java&lt;/strong&gt; auf &lt;strong&gt;5.0&lt;/strong&gt;. Das &lt;strong&gt;JavaScript Toolkit&lt;/strong&gt; ist nicht n&amp;#246;tig. &lt;/li&gt;    &lt;li&gt;Beim neuen Web-Projekt gehe auf &lt;strong&gt;Properties&lt;/strong&gt;, dann &lt;strong&gt;Java Build Path&lt;/strong&gt; im Reiter &lt;strong&gt;Libraries&lt;/strong&gt;. L&amp;#246;sche die Apache Tomcat Libraries. &lt;/li&gt;    &lt;li&gt;Lege mit &lt;strong&gt;File &amp;gt; New &amp;gt; Other &amp;gt; Cypal Studio&lt;/strong&gt; ein neues &lt;strong&gt;Module&lt;/strong&gt; an. Gib Paketnamen und Name an. Das Plugin erzeugt daraufhin ein Unterpaket client, mit der Klasse, die EntryPoint erweitert. &lt;/li&gt;    &lt;li&gt;In die Vorlage setzte in onModuleLoad():&lt;code&gt;        &lt;br /&gt;RootPanel.get().add( new Button( &amp;quot;Sag 'Hallo'&amp;quot;, new ClickListener() {         &lt;br /&gt;&amp;#160; public void onClick( Widget w ) {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Window.alert( &amp;quot;Hallo&amp;quot; );         &lt;br /&gt;&amp;#160; }         &lt;br /&gt;} ) );&lt;/code&gt;       &lt;br /&gt;Lasse &lt;strong&gt;Strg+Shift+O &lt;/strong&gt;alle import-Anweisungen einsetzen. (Paket com.google.gwt.core.client und com.google.gwt.core.client.io). &lt;/li&gt;    &lt;li&gt;Auf dem Projekt gehe unter &lt;strong&gt;Run As &amp;gt; Run Configuration&lt;/strong&gt;, &lt;strong&gt;GWT Hosted Mode Application&lt;/strong&gt;, &lt;strong&gt;New_configuration&lt;/strong&gt;. Ist das Modul ausgew&amp;#228;hlt. startet &lt;strong&gt;Run&lt;/strong&gt; die Google GWT-Umgebung. &lt;/li&gt;    &lt;li&gt;F&amp;#252;r einen neuen Service &amp;#246;ffne &lt;strong&gt;File &amp;gt; New &amp;gt; Other Cypal Studio &amp;gt; Remote Service&lt;/strong&gt;. Der Service soll &lt;strong&gt;FileService&lt;/strong&gt; hei&amp;#223;en. Die Service-URL soll &lt;strong&gt;file&lt;/strong&gt; hei&amp;#223;en. Best&amp;#228;tige den Dialog. Der Generator legt eine Klasse und eine Schnittstelle f&amp;#252;r die Client- und eine weitere Klasse f&amp;#252;r die Server-Seite an. W&amp;#228;hle zun&amp;#228;chst den Client aus com.tutego.client.FileService. Setze in den Rumpf der Klasse die Methode String[] getFiles(String path);. Ein Compilerfehler taucht dann bei der Realisierung com.tutego.server.FileServiceImpl auf. Setze dort hinein: public String[] getFiles( String path ) { return new File(path).list(); } &lt;/li&gt;    &lt;li&gt;Erweitere in der Hauptklasse die Methode onModuleLoad() durch:      &lt;br /&gt;&lt;code&gt;final ListBox listBox = new ListBox();        &lt;br /&gt;FileService.Util.getInstance().getFiles( &amp;quot;c:/&amp;quot;, new AsyncCallback&amp;lt;String[]&amp;gt;() {         &lt;br /&gt;&amp;#160; public void onFailure( Throwable throwable ) { }         &lt;br /&gt;&amp;#160; public void onSuccess( String[] strings ) {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for ( String string : strings )         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listBox.addItem( string );         &lt;br /&gt;&amp;#160; };         &lt;br /&gt;} );         &lt;br /&gt;RootPanel.get().add( listBox );&lt;/code&gt; &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Zum Weiterlesen &lt;a title="http://blogs.pathf.com/agileajax/2007/07/36-gwt-tutorial.html" href="http://blogs.pathf.com/agileajax/2007/07/36-gwt-tutorial.html"&gt;http://blogs.pathf.com/agileajax/2007/07/36-gwt-tutorial.html&lt;/a&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ol&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/gwt-beispiel-in-eclipse.html' title='GWT-Beispiel in Eclipse'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=7612292870896360592' title='2 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7612292870896360592'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7612292870896360592'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-4276333232732190856</id><published>2008-05-24T10:06:00.001+02:00</published><updated>2008-05-24T10:06:33.515+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Swing-Komponenten: JIDE Common Layer</title><content type='html'>&lt;p&gt;JIDE ist ein Unternehmen, welches schon seit vielen Java qualitativ hochwertige Swing-Komponenten baut. Einige der Komponenten sind frei (&lt;a href="https://jide-oss.dev.java.net/"&gt;JIDE Common Layer (Open Source Project)&lt;/a&gt;), weitere wie das Docking-Framework, Action Framework, (Pivot) Grids, Code Editor und weitere geh&amp;#246;ren zum kommerziellen Teil. Die Komponenten aus dem &lt;a href="https://jide-oss.dev.java.net"&gt;JIDE Common Layer&lt;/a&gt; stehen unter dual-license: GPL und free commercial license.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Textbox, die sich automatisch erweitert&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="435" src="http://www.tutego.com/images/java/swing/jide/autoresizingTextArea.png" width="1300" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Tabelle und Liste mit Checkboxen, Split-Pane mit mehreren Bereichen&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="339" src="http://www.tutego.com/images/java/swing/jide/checkBoxTree.png" width="473" border="0" /&gt;    &lt;br /&gt;&lt;img height="160" src="http://www.tutego.com/images/java/swing/jide/checkBoxList.png" width="348" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="234" src="http://www.tutego.com/images/java/swing/jide/jideSplitPane.png" width="414" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Neue Border und Border-Layout mit anderer Anordnung Norden und S&amp;#252;den&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="327" src="http://www.tutego.com/images/java/swing/jide/JideBorder.png" width="324" border="0" /&gt;    &lt;br /&gt;&lt;img height="176" src="http://www.tutego.com/images/java/swing/jide/jideBorderLayout.png" width="378" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Button-Gruppe und Datums, Popupmen&amp;#252; verbreiterbarer Gr&amp;#246;&amp;#223;e und Zeit/Datum-Auswahl&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="184" src="http://www.tutego.com/images/java/swing/jide/jideButton.png" width="150" border="0" /&gt;    &lt;br /&gt;&lt;img height="193" src="http://www.tutego.com/images/java/swing/jide/jidePopup.png" width="334" border="0" /&gt;    &lt;br /&gt;&lt;img height="62" src="http://www.tutego.com/images/java/swing/jide/jideDateSpinner.png" width="148" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Neue Standard-Dialoge&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="461" src="http://www.tutego.com/images/java/swing/jide/jideExpandableDialog.png" width="655" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Verzeichnisauswahl&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="537" src="http://www.tutego.com/images/java/swing/jide/jideFolderChooser.png" width="445" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Overlay legt Komponenten &amp;#252;ber andere Komponenten&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="456" src="http://www.tutego.com/images/java/swing/jide/jideOverlayable.png" width="668" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Scrollpane mit Platz f&amp;#252;r weitere Komponenten, Slider mit zwei Enden&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="176" src="http://www.tutego.com/images/java/swing/jide/jideScrollPane.png" width="475" border="0" /&gt;    &lt;br /&gt;&lt;img height="68" src="http://www.tutego.com/images/java/swing/jide/jideRangeSlider.png" width="414" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Container mit Suche und Selektion&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="581" src="http://www.tutego.com/images/java/swing/jide/jideSearchable.png" width="747" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="323" src="http://www.tutego.com/images/java/swing/jide/jideSearchableBar.png" width="612" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Statt Scrollbar automatisches Scrollen durch Pfeile&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="174" src="http://www.tutego.com/images/java/swing/jide/jideSimpleScrollPane.png" width="655" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Diverse Label&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="969" src="http://www.tutego.com/images/java/swing/jide/jideStyledLabel.png" width="531" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Reiterkomponente&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="199" src="http://www.tutego.com/images/java/swing/jide/jideTabbedPane.png" width="537" border="0" /&gt;&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/swing-komponenten-jide-common-layer.html' title='Swing-Komponenten: JIDE Common Layer'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=4276333232732190856' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4276333232732190856'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4276333232732190856'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-5910117722781187519</id><published>2008-05-23T14:36:00.003+02:00</published><updated>2008-05-24T10:02:07.395+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Eclipse 3.4RC1, Web-Tools und Ganymede-Pakete</title><content type='html'>&lt;p&gt;Eclipse kommt in die &lt;a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.4RC1-200805161333/index.php"&gt;Release Candidates, und der erste kann geladen werden&lt;/a&gt;. Aufgefallen ist mir das erst, nach dem ich gesehen habe, dass es auch ein Update vom WTP mit den &lt;a href="http://download.eclipse.org/webtools/downloads/drops/R3.0/S-3.0RC1-20080519195353/"&gt;Web-Tools 3.0RC&lt;/a&gt;1 gibt. Das Ganymede &lt;a href="http://www.eclipse.org/epp/download.php"&gt;Java EE Package&lt;/a&gt; enthält als All-in-one-Package (JEE ist ca. 160 MB) alles nötige.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/eclipse-34rc1-web-tools-und-ganymede.html' title='Eclipse 3.4RC1, Web-Tools und Ganymede-Pakete'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=5910117722781187519' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/5910117722781187519'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/5910117722781187519'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-3069987346493329852</id><published>2008-05-20T10:44:00.001+02:00</published><updated>2008-05-20T10:44:56.725+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rezension'/><title type='text'>Buchkritik: Java EE 5 Development using GlassFish Application Server</title><content type='html'>&lt;p&gt;&lt;em&gt;David Heffelfinger. Packt Publishing. ISBN 1847192602. Oktober 2007. 408 Seiten&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Tr&amp;#228;gt ein Buchtitel eine Technologie und gleichzeitig ein Produkt im Namen, ist das eine schwere Mischung. Entweder wird auf die Administration des Servers eingegangen, oder wir finden ein Lehrbuch, das nur Beispiele lauff&amp;#228;hig auf einem speziellem Produkt vorweisen kann. Heffelfingers Werk geh&amp;#246;rt in keine Kategorie. Der Bezug zu Glassfish ist minimal, und wer mehr sucht als eine kleine Installationsanweisung &amp;#8211; die es auch im Netz bei Sun gibt &amp;#8211;, wird entt&amp;#228;uscht. Da die sauberen Java EE Beispiele den Entwickler nicht an einen speziellen Container binden, sind seine Quellcodes auch auf JBoss oder Geronimo ablauff&amp;#228;hig. Wer nun Java EE lernen m&amp;#246;chte, ist sicherlich darin interessiert, seine Beispiele zumindest auf einem Server laufen zu sehen. Aus Sicht der Zielgruppe eines Buches wohl eher unn&amp;#246;tig einschr&amp;#228;nkend. &lt;/p&gt;  &lt;p&gt;Didaktisch und fachlich gibt es das ein oder andere zu bem&amp;#228;ngeln. Einige Quellcode-Snippets bekommen ihr @Override vor den &amp;#252;berschriebenen Servlet-Methoden, andere nicht. Und warum wird der String-Konstruktor laienhaft verwendet? &lt;/p&gt;  &lt;p&gt;application.setAttribute(&amp;quot;applicationAttribute&amp;quot;, new String( &amp;quot;This string is accessible accross sessions.&amp;quot;)); &lt;/p&gt;  &lt;p&gt;Oder parameterName aus String deklariert, aber sp&amp;#228;ter dennoch einmal explizit gecastet? &lt;/p&gt;  &lt;p&gt;String parameterName = (String) initParameterNames.nextElement();    &lt;br /&gt;out.print(config.getInitParameter((String) parameterName)); &lt;/p&gt;  &lt;p&gt;Oder ein StringBuffer statt der guten allen String-Konkatenation eingesetzt? &lt;/p&gt;  &lt;p&gt;@Override public String toString() {    &lt;br /&gt;StringBuffer fullNameBuffer = new StringBuffer();     &lt;br /&gt;fullNameBuffer.append(firstName);     &lt;br /&gt;fullNameBuffer.append(&amp;quot; &amp;quot;);     &lt;br /&gt;fullNameBuffer.append(lastName);     &lt;br /&gt;return fullNameBuffer.toString();     &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Hier ist ein return firstName + &amp;quot; &amp;quot; + lastName; doch wirklich angenehmer zu lesen und auch die Performance gar nicht schlechter. &lt;/p&gt;  &lt;p&gt;Ebenso hei&amp;#223;e ich es nicht f&amp;#252;r sinnvoll, auf das MVC-Konzept auch bei JSP/Servlets zu verzichten. Didaktisch d&amp;#252;rften JSPs eher vor Servlets Sinn ergeben. JSPs gehen mir auch zu fr&amp;#252;h runter auf implizite Objekte und eine Skriptlet-Ebene ohne fr&amp;#252;h schon EL und die Standard-TagLib zu erkl&amp;#228;ren. Die web.xml-Datei bekommt auch immer unterschiedliche Schema-Dateien und Versionen untergeschoben: Einmal 2.4, dann wieder das aktuelle 2.5. Beim Fehlerhandling findet sich: &lt;/p&gt;  &lt;p&gt;StringWriter stringWriter = new StringWriter();    &lt;br /&gt;PrintWriter printWriter = new PrintWriter(stringWriter);     &lt;br /&gt;exception.printStackTrace(printWriter);     &lt;br /&gt;out.write(stringWriter.toString()); &lt;/p&gt;  &lt;p&gt;Warum der Autor nicht einfach exception.printStackTrace(new PrintWriter(out)); schreibt, ist mir ein R&amp;#228;tsel. (out ist ein JspWriter extends Writer und printStackTrace() m&amp;#246;chte einen PrintStream oder PrintWriter.) Dann ist die Definition einer Bean falsch: &amp;#8222;All of its variables must be private.&amp;#8221; Die von Properties verwendeten Attribute sind in der Regel private, aber sie m&amp;#252;ssen es nicht sein. Auch sind nat&amp;#252;rlich public static final-Konstanten erlaubt. (Wunderbar, dass ausgerechnet im zugeh&amp;#246;rigen Beispiel die Variablen nicht private sind, sondern paketsichtbar.) &lt;/p&gt;  &lt;p&gt;Die Datenbank ist mit zehn Tabellen vielleicht f&amp;#252;r Einstiegerbeispiele doch etwas zu kompliziert. Als Leser ist man erschrocken, pl&amp;#246;tzlich ein Servlet zu sehen, welches an die Datenbank geht und SQL-Anweisungen ausf&amp;#252;hrt. Warum sieht man so einen Wahnsinn noch im Jahre 2008? Die Datenbank-Connection wird zudem nicht korrekt im finally-Block geschlossen. Es reicht, auf Seite 120 gebe ich auf und wage den Wiedereinstieg auf Seite 347. (&amp;#220;bersprungen werden Standard TagLibs, JSF, JMS, Security, EJB, Web-Services.) Zum Abschluss ein kleiner H&amp;#246;hepunkt: Heffelfinger geht praktisch auf Facelets ein und zeigt auch ein Beispiel f&amp;#252;r das Templating, ein Weiteres f&amp;#252;r Ajax4jsf und JBoss Seam findet sich ebenso. Ein erneuter Lichtblick: Der Autor verwendet vorbildlich die vorgesehene Dateieindung .jspf f&amp;#252;r inkludierte JSP-Fragmente. Dann noch etwas IDE-Integration (NetBeans und Eclipse) und der Spuk ist vorbei.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/buchkritik-java-ee-5-development-using.html' title='Buchkritik: Java EE 5 Development using GlassFish Application Server'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=3069987346493329852' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/3069987346493329852'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/3069987346493329852'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-4100569739084227823</id><published>2008-05-20T08:52:00.001+02:00</published><updated>2008-05-20T08:52:37.681+02:00</updated><title type='text'>Buchkritik: Java/J2EE Job Interview Companion - 400+ Questions &amp; Answers</title><content type='html'>&lt;p&gt;&lt;i&gt;Arulkumaran Kumaraswamipillai, Sivayini Arulkumaran. Lulu.com. ISBN 1411668243. April 2007. 355 Seiten&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Es handelt sich um ein interessantes Buch, welches ich in dieser Form noch nicht gelesen habe. Meist dreht es sich ja um Anwendungsdesign oder harte Technologien, aber ein Buch, welches f&amp;#252;r Java-Entwickler m&amp;#246;gliche Bewerbungsfragen sammelt, ist mir neu. Daher sollte das Werk auch von zwei Seiten beleuchtet werden: Vom Interviewer und vom Interviewten. Beide Gruppen erhalten m&amp;#246;gliche Standardfragen zu diversen Themen aus Java SE, Java EE (+Hibernate +Spring) sowie Anwendungsdesign. Das Niveau wechselt zwischen &amp;#8222;Was ist der Unterschied zwischen String und StringBuffer?&amp;#8220; und &amp;#8222;Erkl&amp;#228;re Inner Join und Outer Join.&amp;#8220; Beide Parteien erhalten ausreichende Antworten, wobei das Buch nur kurze Erkl&amp;#228;rungen liefert und auf breite Ausschweifungen verzichtet; sonst k&amp;#246;nnte leicht ein 2000 Seiten starker W&amp;#228;lzer daraus werden. Die Fragen sind gut gemischt und decken optimal das Standardwissen jedes Entwicklers ab. Trotz des Lobes kann die Erw&amp;#228;hnung einiger Fehler nicht unterbleiben. Ein Beispiel zum Thema Varags: &amp;#8222;The type must be Object and it must be the last argument or the only argument to the method.&amp;#8221; Nat&amp;#252;rlich kann jeder Typ bei Varags verwendet werden, &lt;code&gt;int&amp;#8230;&lt;/code&gt; genauso wie &lt;code&gt;String&amp;#8230;&lt;/code&gt;. Hinzu kommen noch ein paar Kleinigkeiten, wie \n statt %n in &lt;code&gt;printf()&lt;/code&gt;, klein geschriebene Enum-Konstanten, String-Konkatenationen im SQL-Statement f&amp;#252;r variable Teile statt Prepared-Statement und nicht erreichbarer Programmcode beim Schlie&amp;#223;en von JDBC-Connections, wenn es vorher eine Exception gab. Dennoch alles in allem ein gutes Buch zur Vorbereitung und auch zum Auffrischen des Java-Wissens f&amp;#252;r Entwickler, die schon ein paar Jahre Java programmieren.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2008/05/buchkritik-javaj2ee-job-interview.html' title='Buchkritik: Java/J2EE Job Interview Companion - 400+ Questions &amp;amp; Answers'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18862554&amp;postID=4100569739084227823' title='0 Kommentare'/><link rel='replies' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml' title='Kommentare zum Post'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4100569739084227823'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4100569739084227823'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author></entry></feed>