{"id":169,"date":"2008-06-11T11:52:00","date_gmt":"2008-06-11T11:52:00","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=169"},"modified":"2008-06-11T11:52:00","modified_gmt":"2008-06-11T11:52:00","slug":"buchkritik-hardcore-java","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2008\/06\/buchkritik-hardcore-java\/","title":{"rendered":"Buchkritik: Hardcore Java"},"content":{"rendered":"<p><i>Robert Simmons. O&#8217;Reilly. ISBN 0-596-00568-7. M\u00e4rz 2004. 344 Seiten<\/i>   <br \/>Warum tut mir O&#8217;Reilly das an? Ich setze es ohne Bedenken auf Platz 1 in der Liste der Java-B\u00fccher, die einen v\u00f6llig verfehlten Titel tragen. Im Vorwort wird noch gro\u00df verk\u00fcndet: \u201eWe&#8217;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.\u201c und dann kommt nur Anf\u00e4ngerstoff und nix von JDO, EJB oder XML. Daf\u00fcr umso mehr Kindergartenthemen: Jede Klasse ist von java.lang.Object abgeleitet, ein \u201eif\u201c vertr\u00e4gt auch komplexe Anfragen mit ZWEI Bedingungen oder dass es einen ?-Operator gibt. Echt Hardcore! Des Weiteren deklariert Felder in umst\u00e4ndlicher Syntax <code>int[] AN_ARRAY = new int[] {1, 2, 3, 6, 9, 18, 36}; <\/code>statt einfach nur <code>int[] AN_ARRAY = {1, 2, 3, 6, 9, 18, 36};<\/code> Und schlie\u00dflich 30 Seiten Auseinandersetzung von final. Die Namen der Color-Konstanten sind klein statt gro\u00df (gibt es \u201eerst\u201c seit Java 1.4) geschrieben, und warum der Autor in dem Calendar-Beispiel ausdr\u00fccklich nach GMT fragt, ist ebenfalls sonderbar, denn f\u00fcr das Beispiel spielt das \u00fcberhaupt keine Rolle:<\/p>\n<pre class=\"prettyprint\">private Date creationDate = Calendar.getInstance(TimeZone.getTimeZone(\"GMT\")).getTime( );<\/pre>\n<p><\/p>\n<p>Im n\u00e4chsten Kapitel \u00fcber immutable kommt nat\u00fcrlich 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\u00e4hnt er die Unmodified-Wrapper. Weiter zum n\u00e4chsten Hardcore-Thema, der Collection-API. Mr. Simmons schreibt: \u201e&#8230;code is an example of a good interface-based technique:\u201c <\/p>\n<p><\/p>\n<pre class=\"prettyprint\">public class SomeClass {<br \/> HashSet someSet = new HashSet( );<br \/> protected Set someMethod( ) {<br \/>   return this.someSet;<br \/> }<br \/>}<\/pre>\n<p><\/p>\n<p>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\u00e4rt, ist super, aber dann der n\u00e4chste R\u00fcckschlag bei <code>set.add(new String(\"p-&gt;\" + element))<\/code>. Was soll denn das hei\u00dfen? Das n\u00e4chste Kapitel hei\u00dft Exception-Handling (in welchem Java-Einf\u00fchrungsbuch steht das bitte sch\u00f6n nicht?) und der Hinweis, dass finally eine gute Stelle ist, um Datenbankverbindungen zu schlie\u00dfen. Das folgende Kapitel ist noch viel h\u00e4rter. 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\u00e4chsten Hammerthema \u2013 Konstanten und Internationalisierung. Dass Robert auch Klammern kennt, zeigt er in Anweisungen wie dieser:<\/p>\n<p><\/p>\n<pre class=\"prettyprint\">double area = (Math.pow(radius, 2) * PI);<\/pre>\n<p><\/p>\n<p>(Wie w\u00e4re es stattdessen einfach mit <code>radius * radius * 2<\/code>? Oder wollte er ein Beispiel f\u00fcr gr\u00f6\u00dftm\u00f6glichen Rechenaufwand leisten?) Um vielleicht ungenauen Pi-Belegungen von Sun \u00fcber <code>Math.PI<\/code> vorzubeugen, ist es auch sinnvoller, gleich selbst PI vorzubelegen: <code>public static final double PI = 3.141;<\/code>. Ist viel viel besser! Im Kapitel werden auch Bit-Felder vorgestellt inklusive der Bit-Operatoren. Bei den anschlie\u00dfenden Aufz\u00e4hlungen 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 \u00fcber readResolve() bei der Serialisierung. Immerhin hat Robert verstanden, dass es Klassenlader gibt: \u201eYou 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.\u201c Impressive! Im 8. Kapitel geht\u2019s um Datenmodellierung. Kein Java-Thema und auch nur ein paar Seiten. Der Ansatz: \u201eUnterstreiche alle Nomen und du hast Klassen, unterstreiche alle Verben und du hast Methoden\u201c darf auch nicht fehlen. So hat Robert sicherlich gro\u00dfe Enterprise Systeme modelliert. Kapitel 9 hat Reflection zum Thema und etwas zum java.beans Paket. Seine Lust, an alle m\u00f6glichen 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<\/p>\n<p><\/p>\n<pre class=\"prettyprint\">public class WeakHashSet extends AbstractSet implements Set<\/pre>\n<p><\/p>\n<p>(warum steht hier implements Set?) und schreibt einen Weak-Listener. Solch ein Konstrukt ist insbesondere in Swing-Anwendungen sehr n\u00fctzlich, doch hier h\u00e4tte ich den Hinweis gut gefunden, dass etwa die OpenIDE, also NetBeans, hier schon etwas anbietet. Wo jetzt andere \u201eHardcore\u201c-B\u00fccher 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\u00fcsse wie Generics lassen wir uns viel lieber von einem echten Crack, von <a href=\"http:\/\/www.amazon.com\/Effective-Java-2nd-Joshua-Bloch\/dp\/0321356683\/ref=pd_sim_b_title_4\">Joshua Bloch, in seinem Buch<\/a> erkl\u00e4ren. Dann m\u00fcssen wir uns nicht Beispiele wie dieses hier anschauen: <\/p>\n<p><\/p>\n<pre class=\"prettyprint\">class SomeClass&lt;Type&gt; {<br \/> Type value = null;<br \/> public Type getValue() {<br \/>   return this.value();<br \/> }<br \/> public void setValue(final Type value) {<br \/>   this.value = value;<br \/> }<br \/>}<\/pre>\n<p><\/p>\n<p>Typvariablen sollten immer nur aus einzelnen Gro\u00dfbuchstaben bestehen. Bei einer Deklaration wie Type getValue() sieht sonst Type wie ein ordin\u00e4ren 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\u2019Reilly den Mut hat, die schlechten Bewertungen auf der <a href=\"http:\/\/oreilly.com\/catalog\/9780596005689\/\">Webseite<\/a> stehen zu lassen und nicht zu l\u00f6schen. Meine Hochachtung. Bei <a href=\"http:\/\/www.amazon.com\/Hardcore-Java-Robert-Simmons\/dp\/0596005687\">Amazon<\/a> sind die Bewertungen aber noch ehrlicher. Mut wird O\u2019Reilly erst dann wirklich beweisen, wenn sie a) den Titel umformulieren, b) sich einen neuen Autor suchen, der das Buch umschreibt bzw. erweitert oder c) \u2013 die beste Option f\u00fcr jetzt \u2013 das Buch aus dem Sortiment nimmt. 4 Jahre nach Erscheinen wird\u2019s Zeit daf\u00fcr.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Robert Simmons. O&#8217;Reilly. ISBN 0-596-00568-7. M\u00e4rz 2004. 344 Seiten Warum tut mir O&#8217;Reilly das an? Ich setze es ohne Bedenken auf Platz 1 in der Liste der Java-B\u00fccher, die einen v\u00f6llig verfehlten Titel tragen. Im Vorwort wird noch gro\u00df verk\u00fcndet: \u201eWe&#8217;re talking about difficult but extremely powerful and useful programming techniques like reflection, advanced data [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[6],"tags":[],"class_list":["post-169","post","type-post","status-publish","format-standard","hentry","category-rezension"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=169"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/169\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}