<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Simon Koelsch &#187; java</title>
	<atom:link href="http://www.simon-koelsch.de/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.simon-koelsch.de</link>
	<description>coding software, using gadgets</description>
	<lastBuildDate>Mon, 20 Jun 2011 09:38:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Java 7 &#8211; Plan B</title>
		<link>http://www.simon-koelsch.de/226-java-7-plan-b</link>
		<comments>http://www.simon-koelsch.de/226-java-7-plan-b#comments</comments>
		<pubDate>Mon, 04 Oct 2010 16:29:03 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=226</guid>
		<description><![CDATA[Die enge Roadmap von Java 7 war ja schon seit einiger Zeit bekannt. Aus den Diskussionen auf den Mailinglisten der einzelnen Projekte wurde auch relativ deutlich, dass es eng wird, ein Release mit allen Features zu veröffentlichen. Ein Beispiel ist Neal Gafters Posting auf der Project Lambda Mailingliste "A reminder of Project Lambda's scope". Hier [...]]]></description>
			<content:encoded><![CDATA[<p>Die enge Roadmap von <a href="http://openjdk.java.net/projects/jdk7/">Java 7</a> war ja schon seit einiger Zeit bekannt. Aus den Diskussionen auf den Mailinglisten der einzelnen Projekte wurde auch relativ deutlich, dass es eng wird, ein Release mit allen Features zu veröffentlichen.</p>
<p>Ein Beispiel ist <a href="http://gafter.blogspot.com/">Neal Gafters</a> Posting auf der <a href="http://openjdk.java.net/projects/lambda/">Project Lambda</a> Mailingliste <a href="http://mail.openjdk.java.net/pipermail/lambda-dev/2010-April/001290.html">"A reminder of Project Lambda's scope"</a>. Hier merkt Neal im April an, dass eigentlich schon im Juni laut Roadmap ein "feature complete" JDK 7 da sein muss.</p>
<p><a href="http://blogs.sun.com/mr">Mark Reinhold</a> hat dann Anfang September in seinem Blog unter <a href="http://blogs.sun.com/mr/entry/rethinking_jdk7">"Re-thinking JDK 7"</a> das Problem angesprochen und zwei weitere Vorgehensweisen diskutiert:</p>
<ul>
<li>Plan A wäre ein Release von Java 7 wie geplant, allerdings erst 2012.</li>
<li>Plan B ist Java 7 mit den bereits vorhanden Features (also ohne Closures, Jigsaw und teilweise Coin) Mitte 2011 zu veröffentlichen und die restlichen Features im JDK 8 Ende 2012 unterzubringen.</li>
</ul>
<p>Die <a href="http://blogs.sun.com/mr/entry/rethinking_jdk7#comments">meisten Kommentare</a> befürworten Plan B, was seit dem 20. September mit <a href="http://blogs.sun.com/mr/entry/plan_b">"It’s time for … Plan B"</a> bestätigt ist.</p>
<p>Welche Features landen jetzt aber in Java 7, welche in Java 8? Hier also ein kleines Update um meinen Artikel <a href="http://www.simon-koelsch.de/110-java-7-features">"Java 7 Features"</a> zu ergänzen.<br />
<span id="more-226"></span><br />
Die <a href="http://openjdk.java.net/projects/jdk7/features/">Featureliste</a> wurde inzwischen von Reinhold geupdatet, was noch fehlt ist ein tatsächlicher <a href="http://openjdk.java.net/projects/jdk7/milestones/">Zeitplan für die Milestones</a>. Ein paar ursprünglich nicht enthaltene Punkte sind inzwischen ebenfalls dazu gekommen.</p>
<p>Hier die Änderungen für das JDK 7, welches nun also hoffentlich Mitte 2011 erscheinen wird:</p>
<p><strong>Sprachfeatures</strong></p>
<ul>
<li>Project Coin wird in Java 7 enthalten sein, allerdings ohne Unterstützung der Sprache für Collections. Wenn ich die Beschreibung allerdings richtig interpretiere, ist "improved exception handling (multi-catch)" nun doch enthalten.</li>
</ul>
<p><strong>I/O and Networking</strong></p>
<ul>
<li>NIO .2 wird mit einem Provider für .zip- und .jar-Files kommen. </li>
<li>Unter Windows wird in Zukunft der Windows Vista IPv6 Stack bevorzugt benutzt. </li>
<li>Ausserdem wird TLS 1.2 verfügbar.</li>
</ul>
<p><strong>Internationalization</strong></p>
<ul>
<li>Unicode wird nicht wie geplant in der Version 5.1, sondern in Version 6.0 unterstützt. </li>
<li>Ausserdem wurde die Unterstützung von Locales verbessert.</li>
</ul>
<p>Zusätzlich findet dann noch JDBC 4.1 seinen Weg in den Release.</p>
<p>Für Ende 2012, also für Java 8, sind jetzt folgende Punkte geplant: </p>
<ul>
<li>JSR 294 + Jigsaw,</li>
<li>Lambda (Closures),</li>
<li>"Annotations on Java Types" (JSR 308),</li>
<li>das Swing Application Framework (JSR 296) und die Swing Datepicker Komponente.</li>
<li>Neu ist hier noch "Language support for collections".</li>
</ul>
<p>Damit bleiben als JDK 7 Merkmale auf der Sprachseite vor allem <a href="http://java.sun.com/developer/technicalArticles/javase/nio/">NIO 2</a> und <a href="http://openjdk.java.net/projects/coin/">Project Coin</a>. Auf der Seite der VM ist das wohl wichtigste Merkmal <a href="http://java.sun.com/developer/technicalArticles/DynTypeLang/">"Invoke Dynamic"</a>, um die Performance für Scriptsprachen wie Scala zu verbessern.</p>
<p>Ich würde mir für die Zukunft von Java einen "Date-Driven" Releasezyklus wünschen. Hier wäre dann klar, in einem festen Zeitraum kommt ein neues Release welches alle fertigen Features enthält. OpenBSD fährt damit zum Beispiel sehr Erfolgreich. Aber warten wir einfach ab, wie sich Java unter Oracle entwickeln wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/226-java-7-plan-b/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java 7 Features</title>
		<link>http://www.simon-koelsch.de/110-java-7-features</link>
		<comments>http://www.simon-koelsch.de/110-java-7-features#comments</comments>
		<pubDate>Sun, 02 May 2010 14:00:31 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=110</guid>
		<description><![CDATA[Da Java 7, Codename Dolphin, zum Ende des 2. Quartals mit dem letzten Milestone angekündigt ist, habe ich mir ein wenig Zeit genommen um die angekündigten Features vorzustellen. Ein Überblick über die <a href="http://openjdk.java.net/projects/jdk7/milestones/" target="_blank">zehn Milestones</a> selbst ist auf der <a href="http://openjdk.java.net/projects/jdk7/" target="_blank">Projektseite</a> zu finden.]]></description>
			<content:encoded><![CDATA[<p><em><strong>Update:</strong> Einige Features wurden aus Zeitgründen verschoben. Siehe hierzu "<a href="http://www.simon-koelsch.de/226-java-7-plan-b">Java 7 - Plan B</a>".</em></p>
<p>Da Java 7, Codename Dolphin, zum Ende des 2. Quartals mit dem letzten Milestone angekündigt ist, habe ich mir ein wenig Zeit genommen um die angekündigten Features vorzustellen. Ein Überblick über die <a href="http://openjdk.java.net/projects/jdk7/milestones/" target="_blank">zehn Milestones</a> selbst ist auf der <a href="http://openjdk.java.net/projects/jdk7/" target="_blank">Projektseite</a> zu finden.<br />
<span id="more-110"></span></p>
<h3>Erweiterungen der Virtuellen Maschine</h3>
<p>Diese Erweiterungen betreffen nur die Virtuelle Maschine <a href="http://java.sun.com/javase/technologies/hotspot/" target="_blank">HotSpot</a> von Sun. Wer eine andere Lauftzeitumgebung nutzt, zum Beispiel die <a href="http://www.sap.com/germany/plattform/netweaver/index.epx" target="_blank">Netweaver Plattform</a> oder die <a href="http://harmony.apache.org/" target="_blank">Apache Harmony Plattform</a>, den betreffen diese Erweiterungen nicht.</p>
<h4>G1</h4>
<p>Offiziell verfügbar wird mit diesem Release eine neue Variante des Garbage Collectors, genannt G1 ("Garbage First"). G1 ersetzt damit die bisherige "Concurrent Mark-Sweep" (CMS) Methodik von HotSpot.<br />
Oberflächlich erklärt geht CMS so vor, dass der Speicher in verschiedene Bereiche eingeteilt wird. Diese Speicherbereiche enthalten die Objekte je nachdem wie lange ihre Lebensdauer ist. Es existiert ein Bereich für sehr langlebige Objekte, für kurzlebige Objekte, etc. Dabei wird vom Garbage Collector der Speicher durchlaufen und alle nichtmehr referenzierte Objekte werden gelöscht.<br />
Da der Speicher mit der Zeit fragmentiert, muss dieser irgendwann defragmentiert werden, indem die Objekte im Speicher umkopiert werden. Genau hierfuer muss die VM für einen kurzen Moment angehalten werden, was Performance kostet.<br />
Ziel von G1 ist es, genau diese Phasen zu reduzieren. Dabei wird davon ausgegangen, dass je länger ein Objekt "lebt", desto wahrscheinlicher ist, dass es nicht mehr referenziert wird und der Speicher freigegeben werden kann. Je weniger Objekte am Ende existieren, desto kürzer dauert das Kopieren der noch verbleibenden Objekte und desto langsamer fragmentiert der Speicher.<img class="alignright size-medium wp-image-123" title="Java Garbage Collection" src="http://www.simon-koelsch.de/wp-content/uploads/2010/03/gc-300x91.png" alt="G1 vs CMS" width="300" height="91" /><br />
G1 teilt dafür den Speicher in 1MB Bereiche ein und versucht vorauszusagen, wann die Objekte in diesen Bereichen ihre Lebenszeit überschritten haben. Den Objekten wird also genug Zeit zum "sterben" gegeben.<br />
Eine ausführliche Erläuterung des Algorithmus findet sich im Paper <a href="http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf" target="_blank">"Garbage First Garbage Collection" (pdf)</a> von Sun.<br />
"Garbage First" ist übrigends schon seit Java 6 Update 14 als Backport enthalten und kann mit folgenden VM Parametern aktiviert werden:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC</pre></div></div>

<h4>InvokeDynamic</h4>
<p>Die HotSpot VM ist seit längerer Zeit ja nicht nur eine Plattform für Java Anwendungen. Die VM interpretiert in erster Linie Bytecode und dieser kann, wie bei Microsofts .NET, von unterschiedlichen Sprachen kommen. In diesem Umfeld wären da <a href="http://www.jruby.org/" target="_blank">JRuby</a>, <a href="http://www.jython.org/" target="_blank">Jython</a>, <a href="http://www.scala-lang.org/" target="_blank">Scala</a> oder <a href="http://groovy.codehaus.org/" target="_blank">Groovy</a> zu nennen. Problem bisher ist allerdings, dass Java eine typisierte Sprache ist, es wird also schon vor dem Übersetzen der Anwendung festgelegt, von welchem Datentyp die benutzten Variablen sind. Sprachen wie beispielsweise Jython sind allerdings nicht typisiert. Hier werden die Datentypen dynamisch verwaltet. Bisher gibt dafür keine Unterstützung im Bytecode auf VM Ebene, was zu lasten der Perfomance geht. Das bei Java 7 enthaltene JSR 292 führt im Bytecode ein "InvokeDynamic" ein. Dadurch sollte die Performance von nichttypisierten Sprachen in der VM verbessert werden. Weitere Infos sind im <a href="http://openjdk.java.net/projects/mlvm">"Da-Vinci Machine" Projekt</a> zu finden.</p>
<h4>Komprimierte 64-Bit Pointer</h4>
<p>Innerhalb des VM Speichers gibt es OOPs, sogenannte "Ordinary Object Pointer". Diese Pointer zeigen auf beliebige Objekte im Speicher. Dabei ist Objekt nicht im Sinne der objektorientierten Porgrammierung zu verstehen, sondern kann auch ein Element eines Objekts sein (zum Beispiel Instanzvariablen, Objektmetadaten, etc.). Pointer sind auf einem 64-Bit System normalerweise auch 64-Bit gross. Durch das hinzuaddieren einer fixen Speicheradresse kann die größe der Zeiger auch auf einem 64-Bit System auf nur 32-Bit reduziert werden. Dadurch wird der Speicherverbrauch und die Performance verbessert. Wer wissen möchte, wann genau die Pointer komprimiert werden und wie diese Komprimierung genau funktioniert findet <a href="http://wikis.sun.com/display/HotSpotInternals/CompressedOops" target="_blank">im Sun Wiki eine ausführliche Erklärung</a> mit Codebeispielen.</p>
<h3>Modularisierung</h3>
<p>Da das JDK und Java Anwendungen selbst immer größer und komplexer werden, gibt es schon lange Bestrebungen eine Schnittstelle und ein System zur Modularisierung der Komponenten zu schaffen. Um dieses System konsequent umzusetzen sind direkte Änderungen an den VM Spezifikation und der Sprache notwendig.<br />
Mit dem <a href="http://jcp.org/en/jsr/detail?id=294" target="_blank">JSR 294</a> werden diese notwendigen Änderungen in den Standard einfliessen.</p>
<p>Als Referenzimplementierung wird Sun ausserdem das <a href="http://openjdk.java.net/projects/jigsaw/" target="_blank">Jigsaw Projekt</a> bei seinen VMs hinzufügen. Ziel dieses Projekts ist zum einen, ein einfaches "low-level" Modulsystem zur Verfügung zu stellen, zum anderen um damit das JDK selbst zu modularisieren.</p>
<p>Wer jetzt an das schon jahrelang von der Industrie vorangetriebene <a href="http://www.osgi.org/Main/HomePage" target="_blank">OSGI</a> denkt, liegt hier richtig. OSGI hat den gleichen Anspruch, setzt allerdings auf Java SE auf und ist nicht auf Sprach/VM-Ebene verankert. Was letztendlich das bessere Framework ist, darüber <a href="http://groups.google.de/groups/search?q=osgi+vs+jigsaw&#038;qt_s=Groups-Suche" target="_blank">streiten</a> sich die Java-Apostel. Auch ob OSGI und Jigsaw überhaupt in einem Widerspruch zueinander stehen. Sun selbst hat bisher in beide Systeme investiert und diese gefördert.</p>
<h3>Sprachänderungen</h3>
<h4>Type Annotations</h4>
<p>Die durch das <a href="http://jcp.org/en/jsr/detail?id=308" target="_blank">JSR 308</a> vorgeschlagenen sogenannten "Type Annotations" sind inzwischen schon seit dem M4 Milestone im javac Compiler enthalten. Damit wird es möglich Annotationen nicht nur für Klassen und Methoden festzulegen, sondern für alle Datentypen. Dadurch wird zum Beispiel folgender Code zulässig:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">List<span style="color: #339933;">&lt;</span>@NonNull Object<span style="color: #339933;">&gt;</span> foobar</pre></div></div>

<p>Wer seinen Code trotzdem kompatibel zu älteren Java Version halten will, muss allerdings den javac Kompiler des <a href="http://openjdk.java.net/projects/type-annotations/" target="_blank">"Type-Annotation" Projekts</a> benutzen. Der lässt nämlich auch folgenden Code zu:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">  List<span style="color: #339933;">&lt;!--*</span>@NonNull<span style="color: #339933;">*/</span> String<span style="color: #339933;">--&gt;</span> strings<span style="color: #339933;">;</span></pre></div></div>

<p>Der OpenJDK Compiler wird hier die Annotation ignorieren, der des "Typ Annotation" Projekts nicht.</p>
<h4>Project Coin</h4>
<p>Mehrere kleine Sprachänderungen sind im <a href="http://openjdk.java.net/projects/coin/" target="_blank">"Project Coin"</a> zusammengefasst.<br />
Darunter fällt, dass man nun beim Switch-Statement Strings verwenden kann. Ein weiteres Feature wird automatisches Ressourcen Management sein. Wer beispielsweise mit Streams arbeitet, muss diese bisher explizit über eine entsprechende Methode schliessen. Beim automatischen Ressourcen Management wird der Stream dann in einen Try-Block eingeschlossen und beim verlassen dieses Blocks automatisch frei gegeben:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">InputStream</span> in <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileInputStream</span><span style="color: #009900;">&#40;</span>src<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">OutputStream</span> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileOutputStream</span><span style="color: #009900;">&#40;</span>dest<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> buf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">8192</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">int</span> n<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>n <span style="color: #339933;">=</span> in.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
        out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span>buf, <span style="color: #cc66cc;">0</span>, n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Einfacher wird auch die Arbeit bei Zeichenfolgen mit Trennzeichen. Möglich wird einen Unterstrich in numerischen Datentypen zu nutzen:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> phone <span style="color: #339933;">=</span> 040_1234567_123<span style="color: #339933;">;</span></pre></div></div>

<p>Auch die Verwendung von Literalen in Collections verspricht Code weiter lesbarer zu gestalten. Damit kann eine Map im Stil eines Arrays initialisiert werden:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Map</span> PSE <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;H&quot;</span>,
    <span style="color: #cc66cc;">2</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;HE&quot;</span>, <span style="color: #cc66cc;">3</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;LI&quot;</span>,
    <span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Die Initialisierung bezieht sich auf Collections, welche dann auch nicht mehr verändert werden können.<br />
Gegenüber irgendwelchen statischen Codeblöcken die eine Map mit ihrer put-Methode initialisiert ist diese Version sicherlich einfacher.</p>
<p>Eingereicht wurden für das Project Coin über 60 Erweiterungsvorschläge, wovon es 9 ins JDK 7 geschafft haben. Eine <a href="http://wikis.sun.com/display/ProjectCoin/2009ProposalsTOC" target="_blank">vollständige Liste ist im Projektwiki</a> zu finden.<br />
Ich persönlich hätte mir ein vereinfachtes Exception-Handling gewünscht:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>fooException<span style="color: #339933;">|</span>barException ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><del datetime="2010-05-03T09:16:58+00:00">Dieses Proposal hat es leider nicht ins JDK geschafft. Vielleicht klappts ja mit dem JDK 8.</del><br />
Scheinbar ist man sich da noch nicht so wirklich sicher... <a href="http://mail.openjdk.java.net/pipermail/coin-dev/2010-February/002703.html" target="_blank">Joe Darcy hat im Februar nochmal auf der Projektmailingliste bestätigt</a>, dass wohl überlegt wird das Feature doch ins JDK 7 zu übernehmen. Bleibt wohl nur abwarten...</p>
<h4>Project Lambda - Closures in Java</h4>
<p><a href="http://openjdk.java.net/projects/lambda/" target="_blank">Lamda</a> ist wohl das bisher am meisten diskutierte Java 7 Feature. 2008 wurde angekündigt, Closures wären jetzt doch nicht in der neuen Java Version vorhanden, 2009 wurde diese Ankündigung dann wieder zurückgezogen.</p>
<p>Closures sind im Prinzip das Zusammenspiel von zwei Sprachfeatures. Dabei benutzt man anonyme Funktionen um auf Variablen ausserhalb ihrer lexikalischen Sichtbarkeit zuzugreifen. Diese anonyme Funktionen werden Lamdas genannt. Closures sind eine weit verbreitete Technik und werden in anderen Sprachen wie zum Beispiel Ruby, Perl, Lisp und JavaScript häufig genutzt.</p>
<p>Ein Codebeispiel in JavaScript macht diese Erklärung sicherlich ein wenig verständlicher:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> str <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;bar&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> str<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> myFoo <span style="color: #339933;">=</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>myFoo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Die Variable str ist an der Stelle, an der sich der Aufruf von alert befindet, nicht im lexikalischen Bereich verfügbar. Trotzdem kann über eine anonyme Funktion darauf zugegriffen werden.</p>
<p>Hilfreich können Closures vor allem an solchen Stellen sein, wo häufig anonyme innere Klassen erzeugt werden, nur um eine einzige Methode zu benutzen. Wer an GUI Entwicklung mit Swing denkt, kann sich bestimmt vorstellen wie hilfreich Closures hier beim Eventhandling sein können.</p>
<p>Closures sind definitv geplant. Die endgültige Syntax steht allerdings noch nicht fest. Da aber der nächste Milestone näher rückt und es bis Herbst nicht mehr lange hin ist, wird man sich wohl in den nächsten Wochen auf eine Syntax festlegen müssen.<br />
Wer am Entwicklungsprozess näher interessiert ist, der sollte einen Blick ins <a href="http://mail.openjdk.java.net/pipermail/lambda-dev/" target="_blank">lambda-dev Mailinglistenarchiv</a> des Projekts werfen.</p>
<h3>Core</h3>
<h4>Fork And Join</h4>
<p>Mit dem <a href="http://gee.cs.oswego.edu/dl/concurrency-interest/index.html" target="_blank">JSR166y</a> wird das Fork and Join Framework von Doug Lea zum Teil des Java Standards. Um mehrere CPUs effizient nutzen zu können, ist es wichtig seine Anwendung entsprechend zu gestalten. Java bietet dazu den Threading-Mechanismus. Das Problem an Threads ist ein gewisser Overhead bei der Verwaltung. Threads müssen erstellet werden, pausiert, sind geblockt weil sie auf andere Threads warten, etc. Dieser Overhead ist unter umständen grösser als die eigentlich zu berechnende Aufgabe.</p>
<p>Bei der Fork/Join Technik geht es darum ein Problem in viele kleine Probleme zu zerlegen, die völlig unabhängig voneinander gelöst werden können. Anschliessend werden die Teilergebnisse zur Lösung zusammengefasst. Klassisches Teile- und Hersche Prinzip.<br />
Gerade hier sind Threads aber als einziger Mechanismus in Java zu unflexibel um viele kleine Teilprobleme zu lösen. Probleme im Ablauf die Mechanismen wie Locking, etc. erforden, tauchen durch die unabhängigkeit der Teilprobleme voneinander garnicht auf.</p>
<p>Mit dem JSR166y wird ein flexiblerer Mechanismus zur Verfügung gestellt. Hier erstellt man für jedes Teilproblem einen sogenannten "Task". Mehrere "Worker" arbeiten die so erstellten Tasks über eine Queue ab. Diese Queue unterstüzt sowohl das klassische Push/Pop für LIFO als auch take für FIFO.<br />
Normalerweise wird ein Worker nach dem LFIO Prinzip seine Tasks abarbeiten. Sind alle Tasks berechnet, gibt es sogenanntes "Work-Stealing". Dabei wird ein weiterer Task aus der Queue eines zufällig gewählten anderen Workers abgearbeitet, allerdings nach dem FIFO Prinzip. Da "ältere" Tasks wahrscheinlich grössere Probleme enthalten und oftmals wieder in kleinere Tasks zerlegt werden können, wird hierdurch der Verwaltungsaufwand immer wieder neue Tasks zu "stehlen" weiter minimiert.<br />
Lea hat mit seinem Framework Benchmarks für verschiedene mathematische Algorithmen durchgeführt und dabei ist durchaus ein deutlicher Unterschied zu anderen üblichen Multithreading-Methoden zu sehen. Eine Einführung in das Framework, Fork and Join Prinzip und die Benchmarks sind in seinem Paper <a href="http://gee.cs.oswego.edu/dl/papers/fj.pdf" target="_blank">"A Java Fork/Join Framework" (pdf)</a> zu finden.</p>
<h4>NIO.2</h4>
<p>Java bietet mit seinem I/O Paket eine Reihe von rudimentären Eingabe und Ausgabemechanismen wie Streams, Serialisierung und Zugriff auf das Dateisystem. Beim Release der 1.4er API wurde die Performance dieser Mechanismen verbessert und neue Features hinzugefügt. Diese Erweiterung umfasst beispielswiese Hilfsmittel für Zeichensatz Encoding/Decoding, Sprachsupport für Reguläre Ausdrücke, Channels, etc. Zusammengefasst ist diese <strong>N</strong>eue <strong>I</strong>/<strong>O</strong> API unter <a href="http://java.sun.com/j2se/1.4.2/docs/guide/nio/index.html" target="_blank">Java NIO</a>.</p>
<p>Im JDK 7 wird das JSR 203 umgesetzt: <a href="http://http://jcp.org/en/jsr/detail?id=203" target="_blank">"More New I-O APIs for the Java Platform"</a>, kurz NIO.2.<br />
Die Ziele von NIO.2 liegen dabei auf 3 Punkten:<br />
Ein neues verbessertes Interface für das Dateisystem, lösen von Abhängigkeiten der Socket Channel Klassen und Unterstützung für asynchronen I/O Zugriff.</p>
<p>Für diese Änderungen war es eigentlich schon seit langem Zeit. Eine hervoragende Einführung in NIO.2 ist über Google Tech Talks auf YouTube verfügbar. Der Vortrag geht eine knappe Stunde und wird von Alan Bateman (Projektleiter für NIO.2) und Carl Quinn (Google) auf der JavaOne 2008 gehalten: <a href="http://www.youtube.com/watch?v=yNRS1ssLPdQ" target="_blank">The New NIO, aka JSR-203</a> </p>
<p>Ausserdem ist im letzten Jahr ein Artikel welcher das neue Dateisystem Interface beleuchtet im Sun Developer Network erschienen: <a href="http://java.sun.com/developer/technicalArticles/javase/nio/">The Java NIO.2 File System in JDK 7</a></p>
<h4>Classloader Änderungen</h4>
<p>Sicherlich lädt nicht jeder Java Entwickler mit dem <a href="http://download.java.net/jdk7/docs/api/java/net/URLClassLoader.html" target="_blank">URLClassLoader</a> seine Klassen selbst oder schreibt einen eigenen Classloader. Hier sind allerdings mit der Zeit unter anderem zwei Probleme aufgetaucht die in der neuen JDK Version gelöst werden:</p>
<p>In Java ist es nicht möglich zu bestimmen, wann der Garbage Collector nicht mehr referenzierte Ressourcen freigibt. Gerade bei zum Beispiel .jar Files die über den URLClassLoader geöffnet wurden, kann das in Kombination mit dem Windows Dateisystem Locking zu Problemen führen. Es lässt sich nicht sicherstellen, dass der Zugriff auf die geladenen Ressourcen zeitnah beendet wird. Der URLClassLoader implementiert nun aber das <a href="http://download.java.net/jdk7/docs/api/java/io/Closeable.html" target="_blank">Closeable Interface</a>. Hier können durch die Methode close() explizit der URLClassLoader und alle von ihm referenzierten Ressourcen geschlossen werden.</p>
<p>Beim Laden von neuen Klassen muss ein Classloader zuerst prüfen, ob eine Klasse nicht bereits geladen wurde. Wenn nicht, kann er diese innerhalb der VM definieren. Im Hinblick auf Multithreading und mehrere Classloadern innerhalb einer VM können sehr schnell komplexe und schwierig zu debuggende Probleme entstehen. Aus diesem Grund sind die meisten Methoden auf das Classloader Lock "synchronized". Dadurch wird aber unter bestimmten Voraussetzungen ein klassisches Deadlock erzeugt.<br />
Um dieser Problematik entgegenzuwirken wurden einige Änderungen an java.lang.ClassLoader vorgenommen. Unter anderem steht nun eine Methode registerAsParallelCapable() zur Verfügung, um mit einem Classloader explizit seine threadsafe Eigenschaft zu signaliseren.<br />
Alle Änderungen sind im <a href="http://openjdk.java.net/groups/core-libs/ClassLoaderProposal.html" target="_blank">JDK 7 Classloader Proposal</a> sehr transparent und übersichtlich erklärt. Hier wurden ebenfalls die verschiedenen Lösungsvorschläge und Vorgehensweise um das Problem zu beheben ausführlich dargestellt.</p>
<h4>Updates für Solaris</h4>
<p>Im OpenJDK gibt es auch zwei implementierungsabhängige APIs für Solaris: Es wird Support für die mehr oder weniger populären <a href="http://en.wikipedia.org/wiki/SCTP" target="_blank">SCTP</a> und <a href="http://en.wikipedia.org/wiki/Sockets_Direct_Protocol" target="_blank">SDP</a> Protokolle geben.</p>
<h3>Graphik</h3>
<p>Bisher gibt es bei Java verschiedene Möglichkeiten Graphik zu rendern. Das Rendern über Software ist in der Regel deutlich langsamer, als wenn die Graphikhardware des Rechners benutzt wird. Dafür gibt es dann sogenannte Rendering Pipelines. Direct3D ist nur auf Windows Systemen verfügbar, für alle anderen Systeme gibt es OpenGL. Unter Systemen mit X11 ist das X11 eigene XRendering inzwischen allerdings fast Standard und auf einer größeren Bandbreite an Hardware verfügbar. In Java 7 wird es dann für Java2D eine eigene XRender Pipeline geben.</p>
<h3>Sonstiges</h3>
<p>Natürlich wird auch der XML Stack einem Update unterzogen, dass bedeutet die JAXP, JAXB, und JAX-WS APIs werden in der letzten stabilen Version vorliegen.<br />
Das schon seit einer Weile enthaltene Swing Look&amp;Feel <a href="https://nimbus.dev.java.net/spec/index.html">Nimbus</a> wird jetzt auch offizieller Standard.<br />
Swing wird ausserdem um den neuen "JXLayer" ergänzt. Dieser Layer bringt "hübsches" sperren von Komponenten mit sich (<a href="https://jxlayer.dev.java.net/webstart/LockableDemo.jnlp">Webstart Beispiel</a>), Maus Auto-Scrolling (<a href="https://jxlayer.dev.java.net/webstart/MouseScrollableDemo.jnlp">Webstart Beispiel</a>) und noch <a href="https://jxlayer.dev.java.net/">ein paar Spielerein mehr</a>.<br />
Weiterhin wird Java ab der 7er Version den Unicode Standard 5.1 unterstützen (aktuell ist 5.2) und das <a href="http://en.wikipedia.org/wiki/Elliptic_curve_cryptography" target="_blank">kryptografische Verfahren ECC (Elliptic-Curve-Cryptography)</a> von Haus aus unterstützen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/110-java-7-features/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FindBugs &#8211; Eclipse Plugin zur Fehlererkennung</title>
		<link>http://www.simon-koelsch.de/79-findbugs-eclipse-plugin-zur-fehlererkennung</link>
		<comments>http://www.simon-koelsch.de/79-findbugs-eclipse-plugin-zur-fehlererkennung#comments</comments>
		<pubDate>Mon, 19 Oct 2009 16:35:44 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=79</guid>
		<description><![CDATA[FindBugs ist ein Eclipse Plugin um häufig gemachte Fehler in seinem Quellcode zu finden. Entstanden ist dieses Projekt an der University of Maryland und wurde inzwischen nach eigenen Angaben ueber 700.000 mal heruntergeladen. Um Fehler zu finden wird der Bytecode der kompilierten Java Klassen auf auffälligen Muster untersucht, welche haeufig auf einen Fehler schliessen lassen. [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Offizielle Projektseite" href="http://mojo.codehaus.org/findbugs-maven-plugin/">FindBugs</a> ist ein Eclipse Plugin um häufig gemachte Fehler in seinem Quellcode zu finden. Entstanden ist dieses Projekt an der University of Maryland und wurde inzwischen nach eigenen Angaben ueber 700.000 mal heruntergeladen.<br />
Um Fehler zu finden wird der Bytecode der kompilierten Java Klassen auf auffälligen Muster untersucht, welche haeufig auf einen Fehler schliessen lassen.<br />
<span id="more-79"></span><br />
Das Plugin bringt dazu selbst im Moment 369 sogenannter "<em>Bugpattern</em>" mit. Eingeteilt sind diese Pattern in folgende Kategorien:</p>
<ul>
<li>Bad Practice</li>
<li>Correctness</li>
<li>Experimental</li>
<li>Internationalization</li>
<li>Malicious code vulnerability</li>
<li>Multithreaded correctness</li>
<li>Performance</li>
<li>Security</li>
<li>Dodgy</li>
</ul>
<p>In der Konfiguration ist es dann möglich, die einzelnen Pattern an/abzuwählen, nur schnelle Pattern prüfen zu lassen, das Reporting nach Kategorien zu beschränken oder mit Filtern spezielle Dateien von einer Pruefung auszuschliessen.</p>
<p>Hier ein kurzes Code Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">String</span> str <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">String</span> str2 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>str <span style="color: #339933;">==</span> str2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// ...</span></pre></div></div>

<p>FindBugs kritisiert hier den String-Vergleich, welcher wahrscheinlich ueber die Equals-Methode des Strings gemacht werden sollte. Auch ist der explizite Aufruf des Konstruktors der Stringklasse in der ersten Zeile überflüssig.</p>
<p>Ein Beispiel für häufige Nullpointer Exception Fehler:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">User user <span style="color: #339933;">=</span> <span style="color: #003399;">Map</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;id3345&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>user <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
user.<span style="color: #006633;">refresh</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003399;">String</span> pwd <span style="color: #339933;">=</span> user.<span style="color: #006633;">getPassword</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Hier wird ausserhalb der Bedingung auf ein eventuell nicht vorhandenes Objekt zugegriffen. FindBugs markiert die entsprechende Stelle dann mit einer Warnung.</p>
<p>Implementiert eine Klasse das java.util.Iterator Interface ohne eine NoSuchElementException zu werfen, wird auch diese Klasse als Fehlerhaft makiert. So gibt es eine Unmenge an weiteren Beispielen im <a title="FindBugs Handbuch" href="http://findbugs.sourceforge.net/bugDescriptions.html">Handbuch, welches alle Pattern dokumentiert</a>.</p>
<p>Wem die vorhanden Pattern nicht reichen, der kann relativ einfach selbst eigene Pattern erstellen und mit FindBugs benutzen. So lassen sich zum Beispiel auch Fehler in der falschen Benutzung von eigenen Frameworks finden. Chris Grindstaff von IBM hat ein kleines Tutorial dazu geschrieben: <a title="Custom Bug Detector" href="http://www.ibm.com/developerworks/java/library/j-findbug2/">Writing custom bug detectors</a>.<br />
<a title="FindBugs Contributions" href="http://fb-contrib.sourceforge.net/">fb-contrib</a> ist eine offene Sammlung eigener Pattern.</p>
<p>FindBugs muss übrigends nicht zwingend als Eclipse Plugin benutzt werden. Es gibt eine eigene <a title="FindBugs GUI im Handbuch" href="http://findbugs.sourceforge.net/manual/gui.html">GUI</a> dafür und wer will kann es sogar als <a title="FindBugs Handbuch - Ant-Task" href="http://findbugs.sourceforge.net/manual/anttask.html">Ant-Task</a> in seinem Deploymentprozess nutzen. Auch für <a title="Maven Plugin" href="http://maven-plugins.sourceforge.net/maven-findbugs-plugin/index.html">Maven</a> und <a title="Maven 2.x Plugin" href="http://mojo.codehaus.org/findbugs-maven-plugin/">Maven 2.0</a> gibt es inzwischen ein entsprechendes Plugin.<br />
Hier ist der <a title="FindBug Download" href="http://http://findbugs.sourceforge.net/downloads.htmlhttp://findbugs.sourceforge.net/downloads.html">Download</a> zu finden.<br />
Plugin only: <em>http://findbugs.cs.umd.edu/eclipse</em> ist die offizielle Update Seite fuer den Eclipse Plugin Manager.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/79-findbugs-eclipse-plugin-zur-fehlererkennung/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

