<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10germanfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-18862554</id><updated>2009-11-08T08:23:31.902+01:00</updated><title type="text">Java Blog</title><subtitle type="html">In diesem Blog schreibt Christian Ullenboom über aktuelle Java-Entwicklungen, Neuerungen im Buch ›Java ist auch eine Insel‹, Updates bei Java Open-Source-Bibliotheken, Best-Practices, Fortschritte bei den IDEs und neue Eclipse-Plugins.</subtitle><link rel="alternate" type="text/html" href="http://www.tutego.com/blog/javainsel/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><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="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>420</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/javainsel" type="application/atom+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=de&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://us.i1.yimg.com/us.yimg.com/i/de/my/addtomyyahoo4.gif">Subscribe with Mein Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/javainsel" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fjavainsel" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><id>tag:blogger.com,1999:blog-18862554.post-5780895915341442986</id><published>2009-11-04T18:54:00.000+01:00</published><updated>2009-11-04T18:54:06.452+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Insel" /><title type="text">Ersetze in einem String die alle diakritischen Zeichen (ä-&gt;a, ...)</title><content type="html">String s = "Müller";&lt;br /&gt;s = Normalizer.normalize( s, Normalizer.Form.NFD );&lt;br /&gt;s = s.replaceAll( "[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+", "" );&lt;br /&gt;System.out.println( s );&amp;nbsp; // Muller&lt;br /&gt;&lt;br /&gt;Die Lösung geht zweistufig vor. Der Normalisier zerlegt zunächst den String und macht die eigentliche Arbeit. replaceAll() entfernt dann übriggebliebene Punke, Striche, Kreise, Häkchen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-5780895915341442986?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/5780895915341442986/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=5780895915341442986" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/5780895915341442986" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/5780895915341442986" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/wbs_Y4fU0Bk/ersetze-in-einem-string-die-alle.html" title="Ersetze in einem String die alle diakritischen Zeichen (ä-&gt;a, ...)" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/ersetze-in-einem-string-die-alle.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2663470010809377339</id><published>2009-11-04T16:50:00.000+01:00</published><updated>2009-11-04T16:50:00.739+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java 7" /><category scheme="http://www.blogger.com/atom/ns#" term="Insel" /><title type="text">Swing-Komponenten neu erstellen oder verändern und JLayer</title><content type="html">Zum Aufbau neuer Swing-Komponenten kommen eine Reihe von Möglichkeiten in Frage. Wenn passend, lässt sich eine existierende Swing-Komponente als Basisklasse nehmen und um nötige Eigenschaften erweitern, sofern die Basisklassen diese Möglichkeit im Grunde schon bieten. Soll etwa ein Texteingabefeld nur IP-Adressen zulassen, so ist dafür keine völlig neue Textkomponentenimplementierung nötig, sondern nur eine Unterklasse der Standard-Komponente mit passendem Dokumenten-Modell. Oder soll ein Liste nur Kontrollkästen (mit Text) darstellen soll, ist das schon über die JList mit passendem Renderer und Modell möglich.&lt;br /&gt;&lt;br /&gt;Unproblematisch ist auch, wenn sich neue Komponenten aus anderen Swing Teilkomponenten zusammenzusetzen lassen und. Dann erweitert die neue Swing-Klasse erweitert einen Container wie JPanel, der einfach die anderen Elemente wie gewünscht platziert. Möglich ist dies zum Beispiel bei einer Statuszeile, da diese nichts großartiges macht, als einfach horizontal andere Komponenten anzuordnen und einen besonderen Rahmen zu setzen. Einen Dialog zur Auswahl eines Zeichensatzes bietet Swing bisher auch nicht an, der lässt sich aber als JDialog mit passenden Swing-Komponenten leicht nachbauen.&lt;br /&gt;&lt;br /&gt;Mehr Arbeit ist nötig, wenn sich auf keine allgemeinen Swing-Komponenten zurückgreifen lässt. Die Swing-Bibliothek bietet etwa keine Ribbon-Komponente, keinen wirklich guten HTML-Renderer, oder ein Docking-Framework. Bei Anforderungen dieser Art lässt sich nicht so einfach auf Standardkomponenten zurückgreifen, sondern spezieller Programmcode zum Zeichnen nötig. Der wesentliche Unterschied ist also der, dass sich die Darstellung nicht vollständig an Standardkomponenten delegieren lässt sondern immer etwas einer Java-Code zum Zeichnen nötig ist.&lt;br /&gt;Um es richtig gut zu machen, sind für eine eigene Swing-Komponente drei Dinge nötig: Die Komponentenklasse, eine Modellklasse und ein UI-Delegate. Die Komponentenklasse ist die Hauptklasse und eine JComponent, die der Entwickler auf die Gui setzt. Sie bietet die API zum Setzten der Zustände. Die Modell-Daten werden nicht selbst in der Komponentenklasse gespeichert, sondern idealweise über eine eigene Klasse modelliert. Die Tabelle nimmt zum Beispiel die Zellen aus einem Tabellemodell, eine Textkomponenten den Text aus einem Dokumentenmodell. Als letztes bleibt der UI-Delegate, der das wirkliche Zeichen und die Ereignisbehandlung übernimmt. Es kann sehr anspruchvoll sein ein gutes Aussehen und effektive Navigation zu erreichen und insbesondere wenn die Komponente in verschiedenen Look-and-Feels arbeiten soll, eine Menge Arbeit werden. Und das die eigene Swing-Komponente die UI-Eigenschaften wie Farben, Abstände und Antialiasing-Modus toleriert ist selbstverständlich.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Überlagerungen mit dem Swing-Komponenten-Dekorator JLayer&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Können Swing-Komponten überlagert werden, können dadurch interessante Effekte erzieht werden. Ein paar Beispiele:&lt;br /&gt;&lt;br /&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Während ein Text in die Textbox geladen wird, erscheint ein JProgressBar.&lt;br /&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Bei aufwändigen Operationen wird das Haupt-Panel gesperrt und eine drehende Sanduhr erscheint.&lt;br /&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Ist die Eingabe in einem Textfeld falsch, erscheint ein kleines Symbol, welches über die invalide Eingabe informiert.&lt;br /&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Über einer leeren Tabelle liegt eine Beschriftung, die erklärt, dass Doppelklick eine neue Zeile einfügt.&lt;br /&gt;&lt;br /&gt;Alle die Darstellungen lassen sich mit Hilfe der in Java 7 eingefügten Klassen JLayer einfach lösen (Nutzer vor Java 7 greifen auf SwingX zurück, denn von dort kommt die Klasse auch; sie heißt nur dort JXLayer. Als Alternative haben Autoren auch oft auf Glass-Pane zurückgegriffen.) &lt;br /&gt;Haupteigenschaft von JLayer ist, sich um existierende Swing-Komponenten zu legen. Soll ein JLayer um ein Textfeld gelegt werden, heißt es: &lt;br /&gt;&lt;br /&gt;JLayer&lt;jcomponent&gt; layer = new JLayer&lt;jcomponent&gt;( textField );&lt;br /&gt;&amp;nbsp;&lt;/jcomponent&gt;&lt;/jcomponent&gt;&lt;br /&gt;Die zu ummantelnde Komponente wird über den Konstruktor angegeben und nicht über add(), da JLayer kein Container ist. Der nächste Schritt ist die Angabe eines Objekts, dass das Zeichnen übernimmt.&lt;br /&gt;&lt;br /&gt;layer.setUI( layerUI );&lt;br /&gt;&lt;br /&gt;Die Angabe erfordert ein LayerUI-Objekt, welches eine paint()-Methode realisiert. Die Implementierung kann super.paint() aufrufen, um die ummantelte Komponente zu zeichnen, und dann eigenen Programmcode hinzufügen, um etwa einen Sanduhr darzustellen.&lt;br /&gt;Das folgende Beispiel fasst die Schritte zusammen und realisiert ein Programm, welches bei Eingabe von „pu“ einen kleinen roten Kreis anzeigt. &lt;br /&gt;&lt;br /&gt;JFrame f = new JFrame();&lt;br /&gt;f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );&lt;br /&gt;f.setLayout( new BorderLayout(2, 2) );&lt;br /&gt;&lt;br /&gt;f.add( new JSeparator(), BorderLayout.PAGE_START );&lt;br /&gt;f.add( new JLabel( "Name:" ), BorderLayout.LINE_START );&lt;br /&gt;&lt;br /&gt;final JTextField textField = new JTextField();&lt;br /&gt;&lt;br /&gt;LayerUI&lt;jcomponent&gt; layerUI = new LayerUI&lt;jcomponent&gt;()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp; public void paint( Graphics g, JComponent component )&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.paint( g, component );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( textField.getText().equalsIgnoreCase( "pu" ) )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.setColor( new Color( 255, 0, 0, 100 ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.fillOval( 0, component.getHeight() - 10, 10, 10 );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;JLayer&lt;jcomponent&gt; layer = new JLayer&lt;jcomponent&gt;( textField );&lt;br /&gt;layer.setUI( layerUI );&lt;br /&gt;f.add( layer );&lt;br /&gt;f.add( new JSeparator(), BorderLayout.PAGE_END );&lt;br /&gt;&lt;br /&gt;f.pack();&lt;br /&gt;f.setVisible( true );&lt;/jcomponent&gt;&lt;/jcomponent&gt;&lt;/jcomponent&gt;&lt;/jcomponent&gt;&lt;br /&gt;&lt;br /&gt;Die JLayer kann auch das Hauptpanel dekorieren und die Events auffangen. Das ist eine zweites Anwendungsfeld neben dem Änderung der Darstellung. Die JLayer-Komponente kann einfach Events auffangen und verarbeiten und so zum Beispiel global F1 für die Hilfe abfangen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-2663470010809377339?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="related" href="http://download.java.net/jdk7/docs/api/javax/swing/JLayer.html" title="Swing-Komponenten neu erstellen oder verändern und JLayer" /><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/2663470010809377339/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=2663470010809377339" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2663470010809377339" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2663470010809377339" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/FWyddlaZWw4/swing-komponenten-neu-erstellen-oder.html" title="Swing-Komponenten neu erstellen oder verändern und JLayer" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/swing-komponenten-neu-erstellen-oder.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2925582633309621065</id><published>2009-11-04T11:31:00.000+01:00</published><updated>2009-11-04T11:31:02.821+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Insel" /><title type="text">JSON-Serialisierung mit Jackson</title><content type="html">Nehmen wir folgende Zeile JavaScript-Code, das ein Person-Objekt mit zwei Properties für Name und Alter definiert. Eine Property wird über ein Schlüssel/Werte-Paar beschrieben:&lt;br /&gt;&lt;br /&gt;var person = { "name" : "Michael Jackson", "age" : 50 };&lt;br /&gt;&lt;br /&gt;Die Definition eines Objekts geschieht in der JSON (JavaScript Object Notation). Als Datentypen unterstützt JSON Zahlen, Wahreiswerte, Strings, Arrays, null und Objekte – wie unser Beispiel zeigt. Die Deklarationen können geschachtelt sein, um Unterobjekte aufzubauen.&lt;br /&gt;Zum Zugriff auf die JSON-Daten kommt der Punkt zum Einsatz, sodass der Name nach der Auswertung durch person.name zugänglich ist.&lt;br /&gt;&lt;br /&gt;Eine Personenbeschreibung wie diese kann auch in einem String stehen, die von JavaScript zur Laufzeit ausgewertet wird.&lt;br /&gt;&lt;br /&gt;var json = 'person = { "name" : "Michael Jackson", "age" : 50 };';&lt;br /&gt;eval( json );&lt;br /&gt;&lt;br /&gt;Der Zugriff auf person.name liefert wie vorher den Namen, denn nach der Auswertung mit eval() wird JavaScript ein neues Objekt mit person im Kontext anlegen.&lt;br /&gt;&lt;br /&gt;JSON ist besonders praktisch, wenn es darum geht, Daten zwischen einem Server und Browser mit JavaScript-Interpreter auszutauschen. Denn wenn der String json nicht von Hand mit einem String initialisiert wurde, sondern ein Server die Zeichenkette person = { … }; liefert, haben wir das, was heutzutage in modernen Ajax-Webanwendungen passiert. Die letzte Frage ist nun, wie elegant der Server Zeichenketten im Datenaustauschformat JSON erzeugt und so Objekte überträgt. Den String per Hand aufzubauen ist eine Lösung, aber es geht besser.&lt;br /&gt;&lt;br /&gt;Die Open-Source Bibliothek&amp;nbsp; Jackson (http://jackson.codehaus.org/) gehört zu den populärsten Lösungen, die JSON-Daten einliest und ausgibt und auf JavaBeans überträgt, sodass eine unkomplizierte Serialisierung in JSON möglich wird.&lt;br /&gt;&lt;br /&gt;ObjectMapper mapper = new ObjectMapper();&lt;br /&gt;MyClass myObject = mapper.readValue( input, MyClass.class );&lt;br /&gt;mapper.writeValue( output, myObject );&lt;br /&gt;&lt;br /&gt;Der ObjectMapper übernimmt das Lesen/Schreiben. In der zweiten Zeile wird aus der Eingabequelle input gelesen und ein Objekt vom Typ MyClass rekonstruiert. In der dritten Zeile wird es in die Ausgabe output geschrieben.&lt;br /&gt;&lt;br /&gt;JSON ist nicht nur für die Objektübertragung zwischen Server und Browser gut, sondern ist eine elegante Alternative zu XML, wenn es etwa um lokale Konfigurationsdateien geht. JSON ist viel kürzer als XML und kann somit zum Beispiel für Konfigurationsdateien übersichtlicher sein.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-2925582633309621065?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/2925582633309621065/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=2925582633309621065" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2925582633309621065" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2925582633309621065" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/ZRi2xwLcAOE/json-serialisierung-mit-jackson.html" title="JSON-Serialisierung mit Jackson" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/json-serialisierung-mit-jackson.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-6457925308164351278</id><published>2009-11-03T20:19:00.002+01:00</published><updated>2009-11-03T20:19:59.365+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Insel" /><title type="text">Bean-Zustände kopieren</title><content type="html">In mehrschichtigen Anwendungen gibt es oft das Muster, dass eine JavaBean etwa über eine Objekt-Relationale-Mapping-Technologie automatisch aus einer Datenbankzeile aufgebaut wird und dann internen in der Geschäftsschicht verwendet wird. Soll nun diese Information über das Netzwerk an einen anderen Rechner verteilt werden, ist es nicht immer angebracht, diese JavaBean etwa direkt über Serialisierung zu versenden. Stattdessen kann ein Transfer-Objekt aufgebaut werden, eine spezielle JavaBean zum Beispiel, sodass der Empfänger keine Abhängigkeit zu der Bean in der internen Geschäftsschicht hat. Nun werden sich aber diese Geschäftsschicht-Bean und Transfer-Bean sehr ähnlich sein und viele Entwickler scheuen die Mühe, lästigen Kopiercode zu erstellen. Doch manuelle Arbeit ist nicht nötig und eine Lösung&amp;nbsp; für das Kopierproblem ist über Refection schnell geschrieben. Über die BeanInfo kommen wir an den PropertyDescriptor (siehe dazu „Properties einer Bean erfragen“) und dann liefern getReadMethod() und getWriteMethod() die Setter/Getter. Bei einer eigenen Kopiermethode wie copyProperties(Object source, Object target) müssen wir bei der Quell-Bean jede Property auslesen und entsprechend beim Ziel-Bean nach der Property suchen und den Setter aufrufen. Wenn das ganze ohne Typkonvertierungen programmiert werden soll, sind es nur wenige Zeilen Programmcode. Kommen einfache Konvertierungen dazu, etwa wenn einmal ein Wrapper als Property-Typ genutzt wird und einmal der primitive Datentyp, ist es etwas mehr.&lt;br /&gt;Der Aufwand mit einer eigenen Implementierung ist allerdings nicht nötig, denn zwei populäre Implementierungen können helfen:&lt;br /&gt;•&amp;nbsp;&amp;nbsp;&amp;nbsp; Apache Commons BeanUtils (http://commons.apache.org/beanutils/). Die Klasse org.apache.commons.beanutils.BeanUtils bietet praktische statische Methoden wie copyProperty(Object bean, String name, Object value), copyProperties(Object dest, Object orig), Object &amp;nbsp;&amp;nbsp;&amp;nbsp; cloneBean(Object bean) oder populate(Object bean, Map properties).&lt;br /&gt;•&amp;nbsp;&amp;nbsp;&amp;nbsp; Dozer (http://dozer.sourceforge.net/). Dozer bringt ausgefeilte Mapping-Möglichkeiten mit, die weit über BeansUtils hinausgehen. Das geht soweit, dass es ein Eclipse-Plugin zur Konfiguration der Abbildungen gibt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-6457925308164351278?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/6457925308164351278/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=6457925308164351278" title="1 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/6457925308164351278" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/6457925308164351278" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/0CdzGdsN9-Y/bean-zustande-kopieren.html" title="Bean-Zustände kopieren" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/bean-zustande-kopieren.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-6669740335865431567</id><published>2009-11-03T16:46:00.000+01:00</published><updated>2009-11-03T16:46:43.829+01: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">Java-Ribbon Komponente Flamingo 4.2 ist raus</title><content type="html">Zu den Features zählen:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Support for placing &lt;a href="http://www.pushing-pixels.org/?p=1262"&gt;small command buttons in ribbon galleries&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Option to specify the callback for &lt;a href="http://www.pushing-pixels.org/?p=1475"&gt;populating the default content of ribbon application menu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Command buttons support &lt;a href="http://www.pushing-pixels.org/?p=1473"&gt;no icon / no text mode&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Emitting full bounding box coordinates in SVG transcoder&lt;/li&gt;&lt;li&gt;Support for changing the expand listener of ribbon bands&lt;/li&gt;&lt;li&gt;Better tracing of inconsistent ribbon resize policies&lt;/li&gt;&lt;/ul&gt;Dass der Command-Button nun flexibler geworden ist, ist prima, denn die Komponente lässt sich auch prima außerhalb der Ribbon-Komponente nutzen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img alt="https://flamingo.dev.java.net/release-info/4.2/command-buttons-icon-and-text1.png" class="aligncenter" src="https://flamingo.dev.java.net/release-info/4.2/command-buttons-icon-and-text1.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Mehr Infos gibt es unter &lt;a href="https://flamingo.dev.java.net/"&gt;https://flamingo.dev.java.net/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mit dem Substance LaF sieht das hervorragend aus.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="https://substance-flamingo.dev.java.net/webstart/testRibbon.jnlp" onclick="javascript:pageTracker._trackPageview('/outgoing/substance-flamingo.dev.java.net/webstart/testRibbon.jnlp');"&gt;&lt;img alt="" border="0" height="23" src="https://substance-flamingo.dev.java.net/images/webstart.png" width="88" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-6669740335865431567?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="related" href="http://www.pushing-pixels.org/?p=1502" title="Java-Ribbon Komponente Flamingo 4.2 ist raus" /><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/6669740335865431567/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=6669740335865431567" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/6669740335865431567" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/6669740335865431567" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/LQ0Oj6V6lNw/java-ribbon-komponente-flamingo-42-ist.html" title="Java-Ribbon Komponente Flamingo 4.2 ist raus" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/java-ribbon-komponente-flamingo-42-ist.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-5069251331768030739</id><published>2009-11-03T14:16:00.002+01:00</published><updated>2009-11-03T14:16:58.538+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java 7" /><category scheme="http://www.blogger.com/atom/ns#" term="Insel" /><title type="text">Process-Ströme in Dateien umlenken</title><content type="html">Ist der Unterprozess über start() gestartet, lassen sich über das Process-Objekt die Ein-/Ausgabe-Datenströme erfragen. Die Process-Klasse bietet getInputStream(), mit dem wir an genau die Daten kommen, die der externe Prozess in seinen Ausgabestrom schreibt, denn sein Ausgabestrom ist unser Eingebestrom, den wir konsumieren können. Auch ist getErrorStream() ein InputStream, denn das, was die externe Anwendung in den Fehlerkanal schreibt, empfangen wir in einem Eingabestrom. Mit getOutputStream() bekommen wir einen OutputStream, dass das externe Programm mit Daten füttert. Dies ist der Pipe-Modus, sodass wir einfach mit externen Programmen Daten austauschen können.&lt;br /&gt;Neben diesem Pipe-Modus gibt es seit Java 7 eine Alternative, die Ströme direkt auf Dateien umzulenken. Dazu definiert die ProcessBuilder-Klasse diverse redirectXXX()-Methoden. (Sollte dann ein getXXXStream()-Aufruf gemacht werden, so kommen nicht-aktive Ströme zurück, denn das externe Programm kommuniziert ja dann direkt mit einer Datei und die Java-Pipe hängt nicht dazwischen.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class java.lang.ProcessBuilder&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;§&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessBuilder redirectInput( File file )&lt;br /&gt;ProcessBuilder redirectInput( ProcessBuilder.Redirect source )&lt;br /&gt;Der Unterprozess wird die Eingaben aus der angegeben Quelle beziehen.&lt;br /&gt;§&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessBuilder redirectOutput( File file )&lt;br /&gt;§&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessBuilder redirectOutput( ProcessBuilder.Redirect destination )&lt;br /&gt;Der Unterprozess wird Standardausgaben an das angegebene Ziel senden.&lt;br /&gt;§&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessBuilder redirectError( File file )&lt;br /&gt;§&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessBuilder redirectError( ProcessBuilder.Redirect destination )&lt;br /&gt;Der Unterprozess wird Fehlerausgaben an das angegebene Ziel senden.&lt;br /&gt;&lt;br /&gt;Die redirectXXX(File file)-Methoden bekommen als Ziel ein einfaches File-Objekt. Die redirectXXX()-Methoden sind aber überladen mit einem anderen Typ Redirect, der als innere statische Klasse in ProcessBuilder angelegt ist. Mit Redirect.PIPE und Redirect.INHERIT gibt es zwei Konstanten, und drei statischen Methoden Redirect.from(File), Redirect.to(File), Redirect.appendTo(File) die Redirect-Objekte für die Umleitung zur Datei liefern. Die mit File parametrisierten Methoden greifen auf die Redirect-Klasse zurück, so dass es bei redirectOutput(File file) intern auf ein redirectOutput(Redirect.to(file)) herausläuft.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-5069251331768030739?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/5069251331768030739/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=5069251331768030739" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/5069251331768030739" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/5069251331768030739" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/q7WmqMhBETY/process-strome-in-dateien-umlenken.html" title="Process-Ströme in Dateien umlenken" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/process-strome-in-dateien-umlenken.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-8623424068444397814</id><published>2009-11-03T11:36:00.000+01:00</published><updated>2009-11-03T11:36:50.891+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java 7" /><category scheme="http://www.blogger.com/atom/ns#" term="Insel" /><title type="text">NumberFormat, Währungen angeben und die Klasse Currency</title><content type="html">Die NumberFormat-Klasse liefert mit getCurrencyInstance() einen Format-Objekt, welches neben der Dezimalzahl auch noch ein Währungssymbol mit anzeigt. So liefert NumberFormat.getCurrencyInstance().format(12345.6789) dann 12.345,68 €, also automatisch mit einem Euro-Zeichen. Dass es ein Euro-Zeichen ist, und kein Yen-Symbol liegt einfach daran, dass Java standardmäßig das eingestellte Land „sieht“ und daraus die Währung ableitet.&amp;nbsp; Wenn wir explizit den Formater mit einem Land initialisieren, etwa wie in&lt;br /&gt;&lt;br /&gt;NumberFormat frmt1 = DecimalFormat.getCurrencyInstance( Locale.FRANCE );&lt;br /&gt;System.out.println( frmt1.format( 12345.6789 ) );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 12&amp;nbsp;345,68 €&lt;br /&gt;&lt;br /&gt;so ist die Währung automatisch Euro (denn Frankreich nutzt den Euro); schreiben wir DecimalFormat.getCurrencyInstance(Locale.JAPAN) ist sie Yen und wir bekommen ¥12,346. (Es gibt standardmäßig keine Nachkommastellen beim Yen.) Locale-Objekten repräsentieren immer eine sprachliche Region.&lt;br /&gt;&lt;br /&gt;DecimalFormat bzw. schon die Oberklasse NumberFormat ermöglicht die explizite Angabe der Währung. In der Java-Bibliothek wird sich durch die Klasse java.util.Currency repräsentiert. NumberFormat liefert mit getCurrency() die eingestellte Currency, die zur Formatierung verwendet wird und setCurrency() setzt sie neu. Das löst Szenarios, in denen etwa ein Euro-Zeichen die Währung darstellt, aber die Zahlenformatierung englisch ist, wie die folgenden Zeilen zeigen:&lt;br /&gt;&lt;br /&gt;NumberFormat frmt = DecimalFormat.getCurrencyInstance( Locale.ENGLISH );&lt;br /&gt;frmt.setCurrency( Currency.getInstance( "EUR" ) );&lt;br /&gt;System.out.println( frmt.format( 12345.6789 ) );&amp;nbsp; // EUR12,345.68&lt;br /&gt;&lt;br /&gt;Die Currency-Klasse bietet drei statische Methoden, die Currency-Objekte liefern. Da ist einmal getAvailableCurrencies(), was ein Set&lt;currency&gt; liefert und die beiden Fabrikfunktion getInstance(Locale locale) und getInstance(String currencyCode). Currency-Objekte besitzen eine ganze Reihe von Objektfunktionen, die etwa den ISO 4217 Währenscode liefen oder den ausgeschriebenen Währungsnamen (und das auch noch in verschiedenen Sprachen wenn gewünscht).&lt;br /&gt;Folgendes Programm geht über alle Währungen und gibt die zentralen Informationen aus:&lt;br /&gt;&amp;nbsp;&lt;/currency&gt;&lt;br /&gt;for ( Currency currency : Currency.getAvailableCurrencies() )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; System.out.printf( "%s, %s, %s (%s)%n",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currency.getCurrencyCode(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currency.getSymbol(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currency.getDisplayName(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currency.getDisplayName(Locale.ENGLISH) );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Wir bekommen dann mehr als 200 Ausgaben, und die Ausgabe beginnt mit:&lt;br /&gt;EGP, EGP, Ägyptisches Pfund (Egyptian Pound)&lt;br /&gt;IQD, IQD, Irak Dinar (Iraqi Dinar)&lt;br /&gt;GHS, GHS, Ghana Cedi (Ghana Cedi)&lt;br /&gt;AFN, AFN, Afghani (Afghani)&lt;br /&gt;MUR, MUR, Mauritius Rupie (Mauritius Rupee)&lt;br /&gt;SGD, SGD, Singapur Dollar (Singapore Dollar)&lt;br /&gt;…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-8623424068444397814?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/8623424068444397814/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=8623424068444397814" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/8623424068444397814" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/8623424068444397814" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/fs4Ot27pUEc/numberformat-wahrungen-angeben-und-die.html" title="NumberFormat, Währungen angeben und die Klasse Currency" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/numberformat-wahrungen-angeben-und-die.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-8164619517405663995</id><published>2009-11-02T17:33:00.000+01:00</published><updated>2009-11-02T17:33:22.463+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Entwicklungsumgebung" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><title type="text">Eclipse 3.6 M3 ist verfügbar</title><content type="html">Unter &lt;a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.6M3-200910301201/eclipse-news-M3.html"&gt;http://download.eclipse.org/eclipse/downloads/drops/S-3.6M3-200910301201/eclipse-news-M3.html&lt;/a&gt; gibt es die News. Die Änderungen in der JDT halten sich mal wieder sehr in Grenzen und bei NetBeans geht viel mehr die Post ab. (Warten wir mal, wie sich Oracles Motivation auf NetBeans so auswirkt.) JUnit wurde auf 4.7 aktualisiert.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-8164619517405663995?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/8164619517405663995/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=8164619517405663995" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/8164619517405663995" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/8164619517405663995" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/IgwtOvuIDAM/eclipse-36-m3-ist-verfugbar.html" title="Eclipse 3.6 M3 ist verfügbar" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/eclipse-36-m3-ist-verfugbar.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-9176447100832535400</id><published>2009-11-02T17:21:00.000+01:00</published><updated>2009-11-02T17:21:02.631+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java 7" /><category scheme="http://www.blogger.com/atom/ns#" term="Insel" /><title type="text">Wrapperklassen-Vergleiche durchführen mit compare() und compareTo()</title><content type="html">Haben wie zwei Ganzzahlen 1 und 2 vor uns, so ist es trivial zu sagen, dass 1 kleiner 2 ist. Bei Fließkommazahlen ist das ein wenig komplizierter, da es hier „Sonderzahlen“ wie Unendlich oder eine negative bzw. positive null gibt. Da insbesondere Vergleichsalgorithmen die Beantwortung der Frage, ob zwei Werte a und b kleiner, größer oder gleich sind, erwarten, gibt es zwei Typen von Methoden in den Wrapper-Klassen.&lt;br /&gt;&lt;br /&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Sie implementieren eine Objektmethode compareTo(). Die Methode ist nicht zufällig da, denn&amp;nbsp; Wrapper-Klassen implementieren die Schnittstelle Comparable. (Wir haben die Schnittstelle schon im Kapitel 6 kurz vorgestellt.)&lt;br /&gt;&lt;br /&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Wrapper-Klassen besitzen statische compare()-Methoden.&lt;br /&gt;&lt;br /&gt;Die Rückgabe der Methoden ist ein int und es kodiert, ob ein Wert größer, kleiner oder gleich ist.&lt;br /&gt;&lt;br /&gt;Beispiel&amp;nbsp;&amp;nbsp; Teste verschiedene Werte.&lt;br /&gt;&lt;br /&gt;System.out.println( Integer.compare(1, 2) );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // -1&lt;br /&gt;System.out.println( Integer.compare(1, 1) );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; 0&lt;br /&gt;System.out.println( Integer.compare(2, 1) );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; 1&lt;br /&gt;&lt;br /&gt;System.out.println( Double.compare(2.0, 2.1) );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // -1&lt;br /&gt;System.out.println( Double.compare(Double.NaN, 0) );// 1&lt;br /&gt;&lt;br /&gt;System.out.println( Boolean.compare(true, false) ); //&amp;nbsp; 1&lt;br /&gt;System.out.println( Boolean.compare(false, true) ); // -1&lt;br /&gt;&lt;br /&gt;Ein true ist „größer“ als als false.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Die Tabelle fasst von den Wrapper-Klassen die Methoden zusammen.&lt;br /&gt;&lt;br /&gt;Klasse&amp;nbsp;&amp;nbsp;&amp;nbsp; Methode aus Comparable&amp;nbsp;&amp;nbsp;&amp;nbsp; Statische Methode compare()&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;Byte&amp;nbsp;&amp;nbsp;&amp;nbsp; int compareTo(Byte anotherByte)&amp;nbsp;&amp;nbsp;&amp;nbsp; int compare(int x, int y)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;Short&amp;nbsp;&amp;nbsp;&amp;nbsp; int compareTo(Short anotherShort)&amp;nbsp;&amp;nbsp;&amp;nbsp; int compare(short x, short y)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;Float&amp;nbsp;&amp;nbsp;&amp;nbsp; int compareTo(Float anotherFloat)&amp;nbsp;&amp;nbsp;&amp;nbsp; int compare(float f1, float f2)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;Double&amp;nbsp;&amp;nbsp;&amp;nbsp; int compareTo(Double anotherDouble)&amp;nbsp;&amp;nbsp;&amp;nbsp; int compare(double d1, double d2)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;Integer&amp;nbsp;&amp;nbsp;&amp;nbsp; int compareTo(Integer anotherInteger)&amp;nbsp;&amp;nbsp;&amp;nbsp; int compare(int x, int y)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;Long&amp;nbsp;&amp;nbsp;&amp;nbsp; int compareTo(Long anotherLong)&amp;nbsp;&amp;nbsp;&amp;nbsp; int compare(long x, long y)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;Character&amp;nbsp;&amp;nbsp;&amp;nbsp; int compareTo(Character anotherCharacter)&amp;nbsp;&amp;nbsp;&amp;nbsp; int compare(char x, char y)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;Boolean&amp;nbsp;&amp;nbsp;&amp;nbsp; int compareTo(Boolean b)&amp;nbsp;&amp;nbsp;&amp;nbsp; int compare(boolean x, boolean y)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Die Implementierung einer statischen Methode WrapperKlasse.compare() ist äquivalent zu WrapperKlasse.valueOf(x).compareTo(WrapperKlasse.valueOf(y)).&lt;br /&gt;&lt;br /&gt;Die Klassen BigInteger, BigDecimal implementieren zwar Number und somit Comparable, aber eine statische compare()-Methode bieten sie nicht. Auch String implementiert Comparable, aber eine statische Methode fehlt. Der Grund ist, dass es eine statische Methode Objects.compare() gibt, zwei Objekte mit einem Comperator vergleicht.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-9176447100832535400?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/9176447100832535400/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=9176447100832535400" title="1 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/9176447100832535400" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/9176447100832535400" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/jYqv9yrCSCE/wrapperklassen-vergleiche-durchfuhren.html" title="Wrapperklassen-Vergleiche durchführen mit compare() und compareTo()" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/wrapperklassen-vergleiche-durchfuhren.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-4020830202190694999</id><published>2009-11-02T15:44:00.000+01:00</published><updated>2009-11-02T15:44:34.806+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java 7" /><category scheme="http://www.blogger.com/atom/ns#" term="Insel" /><title type="text">Die Utility-Klasse java.lang.Objects</title><content type="html">&lt;span lang="DE"&gt;In Java 7 ist die Klasse &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Objects&lt;/span&gt;&lt;span lang="DE"&gt;&amp;nbsp;hinzugekommen, die einige statische Utility-Funktionen bereithält. Sie führen in erster Linie &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt;-Tests durch.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span lang="DE"&gt;null-Tests um equals()/hashCode()/toString()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Ist zum Beispiel eine Objektvariable &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;name&lt;/span&gt;&lt;span lang="DE"&gt; einer Person &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt;, so kann nicht einfach &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;name.toString()&lt;/span&gt;&lt;span lang="DE"&gt; aufgerufen werden, ohne dass eine &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;NullPointerException&lt;/span&gt;&lt;span lang="DE"&gt; folgt. Drei Methoden von &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Objects&lt;/span&gt;&lt;span lang="DE"&gt; führen &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt;-Test durch, bevor sie an die &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Object&lt;/span&gt;&lt;span lang="DE"&gt;-Methode &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt;/&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;hashCode()&lt;/span&gt;&lt;span lang="DE"&gt;/&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;toString()&lt;/span&gt;&lt;span lang="DE"&gt; weiterleiten. Eine zusätzliche Hilfsmethode arbeitet mit Comparatoren, die in im Kapitel über Datenstrukturen genauer vorgestellt werden.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse;"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td style="padding: 0cm; width: 140.8pt;" valign="top" width="188"&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="EN-GB"&gt;class&lt;/span&gt;&lt;span lang="EN-GB"&gt; &lt;/span&gt;&lt;span lang="EN-GB"&gt;java.lang.&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 10pt;"&gt;Objects&lt;/span&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="AufzhlungGP"&gt;&lt;span lang="DE" style="color: purple; font-family: Wingdings; font-size: 8pt;"&gt;§&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;static boolean equals( Object a, Object b )&lt;br /&gt;&lt;/span&gt;&lt;span lang="DE"&gt;Liefert&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt; true&lt;/span&gt;&lt;span lang="DE"&gt; wenn beide Argument entweder &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt; sind, oder &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;a.equls(b)&lt;/span&gt;&lt;span lang="DE"&gt; ebenfalls &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;true&lt;/span&gt;&lt;span lang="DE"&gt; ergibt. Sonst &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;false&lt;/span&gt;&lt;span lang="DE"&gt;. Das &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Objects.equals(null, null)&lt;/span&gt;&lt;span lang="DE"&gt; die Rückgabe &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;true&lt;/span&gt;&lt;span lang="DE"&gt; ergibt ist sinnvoll und so erspart die Methode einige händische Tests.&lt;/span&gt;&lt;span lang="DE" style="color: purple; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="AufzhlungGP"&gt;&lt;span lang="DE" style="color: purple; font-family: Wingdings; font-size: 8pt;"&gt;§&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;static int hashCode( Object o )&lt;br /&gt;&lt;/span&gt;&lt;span lang="DE"&gt;Liefert 0 wenn&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt; o&lt;/span&gt;&lt;span lang="DE"&gt; gleich &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt; ist, sonst &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;o.hashCode()&lt;/span&gt;&lt;span lang="DE"&gt;.&lt;/span&gt;&lt;span lang="DE" style="color: purple; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="AufzhlungGP"&gt;&lt;span lang="DE" style="color: purple; font-family: Wingdings; font-size: 8pt;"&gt;§&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;static String toString(Object o)&lt;br /&gt;&lt;/span&gt;&lt;span lang="DE"&gt;Liefert den String&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;span lang="DE"&gt;"null" wen das Argument &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt; ist sonst &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;o.toString()&lt;/span&gt;&lt;span lang="DE"&gt;.&lt;/span&gt;&lt;span lang="DE" style="color: purple; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="AufzhlungGP"&gt;&lt;span lang="DE" style="color: purple; font-family: Wingdings; font-size: 8pt;"&gt;§&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;static &lt;t&gt; int compare( T a, T b, Comparator c )&lt;br /&gt;&lt;/t&gt;&lt;/span&gt;&lt;span lang="DE"&gt;Liefert 0, wenn&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt; a&lt;/span&gt;&lt;span lang="DE"&gt; und &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;b&lt;/span&gt;&lt;span lang="DE"&gt; beide entweder &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt; sind, oder der Comparator die Objekte &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;a&lt;/span&gt;&lt;span lang="DE"&gt; und &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;b&lt;/span&gt;&lt;span lang="DE"&gt; für gleich erklärt. Sind &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;a&lt;/span&gt;&lt;span lang="DE"&gt; und &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;b&lt;/span&gt;&lt;span lang="DE"&gt; beide ungleich &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt;, so ist die Rückgabe&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt; c.compare(a, b)&lt;/span&gt;&lt;span lang="DE"&gt;. Ist nur &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;a&lt;/span&gt;&lt;span lang="DE"&gt; oder &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;b&lt;/span&gt;&lt;span lang="DE"&gt; gleich &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt;, so hängt es vom Comparator ab und der Reihenfolge der Parameter ab.&lt;/span&gt;&lt;span lang="DE" style="color: purple; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Erinnern wir uns ans &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;hashCode()&lt;/span&gt;&lt;span lang="DE"&gt; vom Spieler, wo der Spielername in den Hashcode eingehen soll, so sehen wir, wo die statische &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Objects.hashCode()&lt;/span&gt;&lt;span lang="DE"&gt;-Methode gut untergebracht werden kann.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="Listingunterschrift"&gt;&lt;span lang="EN-GB"&gt;com/tutego/insel/object/hashcode/Player.java, hashCode() Ausschnitt&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;result = 31 * result + ((name == null) ? 0 : &lt;b&gt;name.hashCode()&lt;/b&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Mit &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Objects.hashCode()&lt;/span&gt;&lt;span lang="DE"&gt; verkürzt sich dies – nicht spektakulär im Sinne von eingesparten Zeichen – zu:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;result = 31 * result + &lt;b&gt;Objects.hashCode( name.hashCode() )&lt;/b&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;span lang="DE"&gt;Null-Prüfungen mit eingebauter Ausnahmebehandlung&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Zu den drei statischen Methoden kommen zwei hinzu, die &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt;-Prüfungen übernehmen und im Fehlerfall eine Ausnahme auslösen. Das ist praktisch bei Konstruktoren oder Settern, die Werte initialisieren sollen, aber verhindern möchten, dass &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt; durchgeleitet wird.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse;"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td style="padding: 0cm; width: 395pt;" valign="top" width="527"&gt;&lt;div class="BStandard"&gt;&lt;span lang="DE"&gt;Beispiel&lt;/span&gt;&lt;span lang="DE"&gt;&amp;nbsp;&amp;nbsp; Die Methde &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;setName()&lt;/span&gt;&lt;span lang="DE"&gt; soll keine &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;name&lt;/span&gt;&lt;span lang="DE"&gt;-Argument gleich &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt; erlauben.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;public void setName( String name )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp;this.name = &lt;b&gt;Objects.nonNull( name )&lt;/b&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="BStandard"&gt;&lt;span lang="DE"&gt;Alternativ ist eine Fehlermeldung möglich:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;public void setName( String name )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp;this.name = &lt;b&gt;Objects.nonNull( name, "name is not supposed to be null" )&lt;/b&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse;"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td style="padding: 0cm; width: 140.8pt;" valign="top" width="188"&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="EN-GB"&gt;class&lt;/span&gt;&lt;span lang="EN-GB"&gt; &lt;/span&gt;&lt;span lang="EN-GB"&gt;java.lang.&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 10pt;"&gt;Objects&lt;/span&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="AufzhlungGP"&gt;&lt;span lang="DE" style="color: purple; font-family: Wingdings; font-size: 8pt;"&gt;§&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;static &lt;t&gt; T nonNull( T obj )&lt;br /&gt;&lt;/t&gt;&lt;/span&gt;&lt;span lang="DE"&gt;Löst eine&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt; NullPointerExcpetion&lt;/span&gt;&lt;span lang="DE"&gt; aus, wenn&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt; obj&lt;/span&gt;&lt;span lang="DE"&gt; gleich&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt; null&lt;/span&gt;&lt;span lang="DE"&gt; ist. Sonst lieferte &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;obj&lt;/span&gt;&lt;span lang="DE"&gt; als Rückgabe.&lt;/span&gt;&lt;span lang="DE" style="color: purple; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="AufzhlungGP"&gt;&lt;span lang="DE" style="color: purple; font-family: Wingdings; font-size: 8pt;"&gt;§&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;static &lt;t&gt; T nonNull( T obj, String message )&lt;br /&gt;&lt;/t&gt;&lt;/span&gt;&lt;span lang="DE"&gt;Wie &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;nonNull(obj)&lt;/span&gt;&lt;span lang="DE"&gt;, nur das die Meldung der &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;NullPointerExcpeption&lt;/span&gt;&lt;span lang="DE"&gt; bestimmt wird.&lt;/span&gt;&lt;span lang="DE" style="color: purple; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-4020830202190694999?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/4020830202190694999/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=4020830202190694999" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/4020830202190694999" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/4020830202190694999" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/2NtY2Mvwu5c/die-utility-klasse-javalangobjects.html" title="Die Utility-Klasse java.lang.Objects" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/die-utility-klasse-javalangobjects.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7317990459240346615</id><published>2009-11-02T15:08:00.001+01:00</published><updated>2009-11-02T15:58:29.217+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Insel" /><title type="text">equals()/hashCode() tief oder flach und mehrdimensionale  Arrays</title><content type="html">&lt;h4&gt;&lt;span lang="DE"&gt;Tiefe oder flache Vergleiche/Hash-Werte&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Referenziert ein Objekt Unterobjekte (etwa eine Person ein String-Objekt für den Namen – keine Primitiven – so geben die Methoden &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt; und &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;hashCode()&lt;/span&gt;&lt;span lang="DE"&gt;den Vergleich bzw. Berechung des Hashcodes an das referenzierte Unterobjekt weiter (wenn es denn nicht-&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;null&lt;/span&gt;&lt;span lang="DE"&gt; ist). Ablesen können wir das an folgendem Ausschnitt unserer &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt;-Methode.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="Listingunterschrift"&gt;&lt;span lang="EN-GB"&gt;com/tutego/insel/object/hashcode/Player.java, equals() Ausschnitt&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;if ( name == null )&lt;br /&gt;&amp;nbsp; if ( ((Player)that).name != null )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br /&gt;else if ( !&lt;b&gt;name.equals( ((Player)that).name&lt;/b&gt; ) )&lt;br /&gt;&amp;nbsp; return false;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Es ist demnach Aufgabe der &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;String&lt;/span&gt;&lt;span lang="DE"&gt;-Klasse (&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;name&lt;/span&gt;&lt;span lang="DE"&gt; ist vom Typ &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;String&lt;/span&gt;&lt;span lang="DE"&gt;) den Gleichheitstest vorzunehmen. Das heißt, dass zwei Personen problemlos &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt;-gleich sein können, auch wenn sie zwei nicht-identische, aber &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt;-gleiche &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;String&lt;/span&gt;&lt;span lang="DE"&gt;-Objekte referenzieren.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Auch bei &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;hashCode()&lt;/span&gt;&lt;span lang="DE"&gt; ist diese Delegation an das referenzierte Unterobjekt abzulesen:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="Listingunterschrift"&gt;&lt;span lang="EN-GB"&gt;com/tutego/insel/object/hashcode/Player.java, hashCode() Ausschnitt&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;result = 31 * result + ((name == null) ? 0 : &lt;b&gt;name.hashCode()&lt;/b&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Dass eine &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt;-Methode bzw. &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;hashCode()&lt;/span&gt;&lt;span lang="DE"&gt; einer Klasse den Vergleich bzw. die Hashcode-Berechnung nicht an die Unterobjekte delegiert, sondern selbst umsetzt, ist unüblich.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;span lang="DE"&gt;equals()/hashCode()-Berechnung bei (mehrdimensionalen) Arrays&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Einen gewissen Sonderfall bei &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt;/&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;hashCode()&lt;/span&gt;&lt;span lang="DE"&gt; nehmen mehrdimensionale Arrays ein. Mehrdimensionale Arrays sind nichts anderes als Arrays von Arrays. Das erste Array für die erste Dimension referenziert jeweils auf Unterarrays für die zweite Dimension. Wichtig wird diese Realisierung bei der Frage, wie diese Verweise der ersten Dimension nun bei &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt; betrachtet werden sollen.&lt;/span&gt;&lt;span lang="DE"&gt; Denn hier stellt sich die Frage, ob die Unterarrays von zwei zu testenden Arrays nur identisch oder auch gleich sein dürfen. Diese Frage hatten wir schon im Kapitel 3, „&lt;/span&gt;&lt;span lang="DE"&gt;Felder vergleichen mit &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.equals()&lt;/span&gt;&lt;span lang="DE"&gt; und &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.deepEquals()&lt;/span&gt;&lt;span lang="DE"&gt;“ angesprochen.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Enthält unsere Klasse ein Array und es soll in einem &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt; mit berücksichtigt werden, so sind prinzipiell drei Varianten zum Umgang mit diesem Array möglich. Felder selbst einfach mit &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;==&lt;/span&gt;&lt;span lang="DE"&gt; wie primitive Werte zu vergleichen ist keine gute Lösung, da Arrays Objekte sind, die wie Strings nicht einfach mit == zu vergleichen sind. Während allerdings Objekte ein &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt; haben, bieten Arrays keine eigene &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt;-Methode, sondern diese ist in die Utility-Klasse &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays&lt;/span&gt;&lt;span lang="DE"&gt; gewandert. Hier gibt es jedoch 2 Methoden die die in Frage kämen. &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.equals(Object[] a, Object[] a2) &lt;/span&gt;&lt;span lang="DE"&gt;&amp;nbsp;geht jedes Element von &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;a&lt;/span&gt;&lt;span lang="DE"&gt;, also bei mehrdimensionalen Arrays jede Referenz auf ein Unterarray durch, und testet, ob es identisch zu einem zweiten Feld &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;a2&lt;/span&gt;&lt;span lang="DE"&gt; ist. Wenn also zwei gleiche aber nicht-identische Hauptarrays identische Unterarray besitzen, liefert &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.equals()&lt;/span&gt;&lt;span lang="DE"&gt; die Rückgabe &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;true&lt;/span&gt;&lt;span lang="DE"&gt;, aber nicht, wenn die Unterarrays zwar gleich, aber nicht identisch sind. Spielt das eine Rolle, so ist &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.deepEquals()&lt;/span&gt;&lt;span lang="DE"&gt;&amp;nbsp;die passende Methode, denn sie geht fragt immer mit &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt; die Unterarray ab.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Bei der Berechnung vom Hash-Wert gibt es eine vergleichbare Frage. Die &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays&lt;/span&gt;&lt;span lang="DE"&gt;-Klasse bietet zur Berechnung vom Hash-Wert eines ganzes Arrays die Methoden &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.hashCode()&lt;/span&gt;&lt;span lang="DE"&gt;&amp;nbsp;und &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.deepHashCode()&lt;/span&gt;&lt;span lang="DE"&gt;. Die erste Methode fragt jedes Unterelement über die von &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Object&lt;/span&gt;&lt;span lang="DE"&gt; angebotene Methode &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;hashCode()&lt;/span&gt;&lt;span lang="DE"&gt; &amp;nbsp;nach dem Hash-Wert. Nehmen wir ein mehrdimensionales Array an. Dann ist das Unterelement ebenfalls ein Feld. &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.hashCode()&lt;/span&gt;&lt;span lang="DE"&gt; wird dann wie erwähnt nur die &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;hashCode()&lt;/span&gt;&lt;span lang="DE"&gt;-Methode auf dem Feld-Objekt aufrufen, während &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.deepHashCode()&lt;/span&gt;&lt;span lang="DE"&gt; auch Unterarray herabsteigt und solange &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.deepHashCode() &lt;/span&gt;&lt;span lang="DE"&gt;auf allen Unterfeldern aufruft, bis ein &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt;-Vergleich auf einem nicht-Feld möglich ist.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Was heißt das nun für unsere &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;equals()&lt;/span&gt;&lt;span lang="DE"&gt;/&lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;hashCode()&lt;/span&gt;&lt;span lang="DE"&gt;-Methode? Üblich ist der Einsatz von &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.equals()&lt;/span&gt;&lt;span lang="DE"&gt; und nicht von &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.deepEquals()&lt;/span&gt;&lt;span lang="DE"&gt; genauso wie &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.hashCode()&lt;/span&gt;&lt;span lang="DE"&gt; üblicher als &lt;/span&gt;&lt;span lang="DE" style="font-size: 10pt;"&gt;Arrays.deepHashCode()&lt;/span&gt;&lt;span lang="DE"&gt; ist.&lt;/span&gt;&lt;span lang="DE"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE"&gt;Das folgende Beispiel zeigt das in der Anwendung. Die Methoden wurden von Eclipse generiert und etwas kompakter geschrieben:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="Listingunterschrift"&gt;&lt;span lang="EN-GB"&gt;com/tutego/insel/object/hashcode/Chess.java, Chess&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;char[][] chessboard;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;@Override public int hashCode()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp; return 31 + &lt;b&gt;Arrays.hashCode( chessboard )&lt;/b&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;@Override public boolean equals( Object obj )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp; if ( this == obj )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp; if ( obj == null )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp; if ( getClass() != obj.getClass() )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp; if ( ! &lt;b&gt;Arrays.equals( chessboard, ((Chess) obj).chessboard )&lt;/b&gt; )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;&amp;nbsp; return true;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ListingStandard"&gt;&lt;span lang="DE"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-7317990459240346615?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/7317990459240346615/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=7317990459240346615" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/7317990459240346615" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/7317990459240346615" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/Eqkgp5DLrE4/equalshashcode-tiefe-oder-flach-und.html" title="equals()/hashCode() tief oder flach und mehrdimensionale  Arrays" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/11/equalshashcode-tiefe-oder-flach-und.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7223830051277611280</id><published>2009-10-26T15:23:00.000+01:00</published><updated>2009-10-26T15:23:03.706+01:00</updated><title type="text">W-JAX ist bald wieder: Konferenz für Java, Enterprise Architekturen, SOA in München</title><content type="html">&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Für alle, die Ihr Wissen im Java &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Enterprise, SOA und Webumfeld auffrischen wollen ist die W-JAX genau das richtige. Sie findet vom 9. bis 13. November 2009 im Westin Grand Arabellapark in München. Über 100 Sessions, 75 Speaker, 18 Special Days, verschiedene Power-Workshops und Keynotes sind geplant.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Parallel zur W-JAX findet als weitere Konferenz die SOACON statt. Die SOACON ist eine Konferenz für Software-Architekten, Projektleiter und IT-Strategen, die sich praxisorientiert über aktuelle Erkenntnisse im SOA-Markt informieren wollen. Beide Konferenzen laufen parallel im selben Gebäude und sind für die Teilnehmer an den gebuchten Tagen frei zugänglich.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-7223830051277611280?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/7223830051277611280/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=7223830051277611280" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/7223830051277611280" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/7223830051277611280" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/PE45XsbKJg0/w-jax-ist-bald-wieder-konferenz-fur.html" title="W-JAX ist bald wieder: Konferenz für Java, Enterprise Architekturen, SOA in München" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/10/w-jax-ist-bald-wieder-konferenz-fur.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-1502583311152715307</id><published>2009-10-25T08:42:00.004+01:00</published><updated>2009-10-25T15:30:51.157+01:00</updated><title type="text">StackOverflow auf Deutsch! -&gt; http://stackunderflow.de/</title><content type="html">&lt;a href="http://stackunderflow.de/"&gt;http://stackunderflow.de/&lt;/a&gt; bringt das beliebte Fragen/Antwort/Wiki/Foren-System &lt;a href="http://stackoverflow.com/"&gt;http://stackoverflow.com/&lt;/a&gt; ins Deutsche. FogCreek lokalisiert im Moment ihre Software, sodass die Übersetzung der Web-Oberfläche noch nicht perfekt ist. Das kommt aber im Laufe der Zeit. Wenn viele mitmachen kann es das größte Frage/Antwort-System auf Deutsch werden. Alles was Programmierung/Administration angeht ist erwünscht. Bisher ist keine automatische Übersetzung der Fragen/Antworten der Originalseite &lt;a href="http://stackoverflow.com/"&gt;http://stackoverflow.com/&lt;/a&gt; in Planung.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-1502583311152715307?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="related" href="http://stackunderflow.de/" title="StackOverflow auf Deutsch! -&gt; http://stackunderflow.de/" /><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/1502583311152715307/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=1502583311152715307" title="1 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/1502583311152715307" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/1502583311152715307" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/KD50C-wV0aE/stackoverflow-auf-deutsch.html" title="StackOverflow auf Deutsch! -&gt; http://stackunderflow.de/" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/10/stackoverflow-auf-deutsch.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2677666191805520341</id><published>2009-10-19T13:45:00.001+02:00</published><updated>2009-10-19T13:45:13.797+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Die wöchentliche Dosis Java" /><title type="text">Thema der Woche: Checked Excpetion vs. Unchecked Exception</title><content type="html">&lt;p&gt;Java unterscheidet Checked von Unchecked Excecption.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Wie unterscheiden sich die Klassenbeziehungen?&lt;/li&gt; &lt;li&gt;Finde je 5 Klassen für Checked und Unchecked Excecptions und erkläre, warum sie Checked oder Unchecked sind.&lt;/li&gt; &lt;li&gt;Das Konzept von Checked Exception ist umstritten und viele andere Sprachen unterscheiden hier nicht. Lies &lt;a title="http://www.octopull.demon.co.uk/java/ExceptionalJava.html" href="http://www.octopull.demon.co.uk/java/ExceptionalJava.html"&gt;http://www.octopull.demon.co.uk/java/ExceptionalJava.html&lt;/a&gt; und extrahiere die Kernthesen.&lt;/li&gt; &lt;li&gt;Was ist das Projekt Lombok und &lt;a title="http://projectlombok.org/features/SneakyThrows.html" href="http://projectlombok.org/features/SneakyThrows.html"&gt;http://projectlombok.org/features/SneakyThrows.html&lt;/a&gt;? Wo bringt der Ansatz Probleme in der Praxis?&lt;/li&gt;&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-2677666191805520341?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/2677666191805520341/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=2677666191805520341" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2677666191805520341" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2677666191805520341" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/uEvcFi26u_I/thema-der-woche-checked-excpetion-vs.html" title="Thema der Woche: Checked Excpetion vs. Unchecked Exception" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/10/thema-der-woche-checked-excpetion-vs.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-5714803704463332567</id><published>2009-10-15T21:42:00.001+02:00</published><updated>2009-10-15T21:42:28.307+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><title type="text">Hibernate Validator 4 ist fertige RI von JSR-303 Bean Validation</title><content type="html">&lt;ul&gt; &lt;li&gt;Doku ist hier: &lt;a title="http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/" href="http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/"&gt;http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Download unter &lt;a title="https://www.hibernate.org/6.html" href="https://www.hibernate.org/6.html"&gt;https://www.hibernate.org/6.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Die JSR-Seite: &lt;a title="http://jcp.org/en/jsr/detail?id=303" href="http://jcp.org/en/jsr/detail?id=303"&gt;http://jcp.org/en/jsr/detail?id=303&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-5714803704463332567?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/5714803704463332567/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=5714803704463332567" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/5714803704463332567" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/5714803704463332567" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/wL_x27W7qXQ/hibernate-validator-4-ist-fertige-ri.html" title="Hibernate Validator 4 ist fertige RI von JSR-303 Bean Validation" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/10/hibernate-validator-4-ist-fertige-ri.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-1116711523623942792</id><published>2009-10-15T21:38:00.001+02:00</published><updated>2009-10-15T21:38:23.932+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Entwicklungsumgebung" /><title type="text">Teil von IntelliJ IDEA wird Open-Source</title><content type="html">&lt;p&gt;Laut Blog-Eintrag unter &lt;a title="http://blogs.jetbrains.com/idea/2009/10/intellij-idea-open-sourced/" href="http://blogs.jetbrains.com/idea/2009/10/intellij-idea-open-sourced/"&gt;http://blogs.jetbrains.com/idea/2009/10/intellij-idea-open-sourced/&lt;/a&gt; wird es eine freie quelloffene Community-Edition geben:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;I believe you’ll like this announcement — IntelliJ IDEA has just &lt;strong&gt;gone open-source&lt;/strong&gt;! Check out the press release as well as the new &lt;a href="http://www.jetbrains.org?utm_source=IDEA_BLOG&amp;amp;utm_media=Anouncement&amp;amp;utm_campaign=IDEA9_CE"&gt;jetbrains.org&lt;/a&gt; community site for the details. We all will soon get a lot of new friends and colleagues in our IntelliJ IDEA community! &lt;p&gt;Starting with the upcoming version 9.0, &lt;a href="http://www.jetbrains.com/idea/nextversion/index.html?utm_source=IDEA_BLOG&amp;amp;utm_media=Anouncement&amp;amp;utm_campaign=IDEA9_CE"&gt;IntelliJ IDEA&lt;/a&gt; will be offered in &lt;strong&gt;two editions&lt;/strong&gt;: Comm&lt;strong&gt;unity Edition and Ultimate Edition&lt;/strong&gt;. The Community Edition focuses on Java SE technologies, Groovy and Scala development. It’s &lt;strong&gt;free of charge and open-sourced&lt;/strong&gt; under the &lt;strong&gt;Apache 2.0 license&lt;/strong&gt;. The Ultimate edition with full Java EE technology stack remains our standard commercial offering. See the &lt;a href="http://www.jetbrains.com/idea/nextversion/editions_comparison_matrix.html?utm_source=IDEA_BLOG&amp;amp;utm_media=Anouncement&amp;amp;utm_campaign=IDEA9_CE"&gt;feature comparison matrix&lt;/a&gt; for the differences. &lt;p&gt;Briefly, in the free &lt;strong&gt;Community Edition&lt;/strong&gt; you’ll get all the Java code support — &lt;strong&gt;various refactorings&lt;/strong&gt; and &lt;strong&gt;code inspections&lt;/strong&gt;, &lt;strong&gt;coding assistance&lt;/strong&gt;; &lt;strong&gt;debugging&lt;/strong&gt;, &lt;strong&gt;TestNG&lt;/strong&gt; and &lt;strong&gt;JUnit&lt;/strong&gt; testing; CVS, &lt;strong&gt;Subversion&lt;/strong&gt; and &lt;strong&gt;Git&lt;/strong&gt; support; &lt;strong&gt;Ant&lt;/strong&gt; and &lt;strong&gt;Maven&lt;/strong&gt; build integration; and &lt;strong&gt;Groovy&lt;/strong&gt; and &lt;strong&gt;Scala&lt;/strong&gt; support (through a separate plugin). To learn more and download the Public Preview of IntelliJ IDEA 9 Community Edition, please visit &lt;a href="http://www.jetbrains.com/idea/nextversion/free_java_ide.html?utm_source=IDEA_BLOG&amp;amp;utm_media=Anouncement&amp;amp;utm_campaign=IDEA9_CE"&gt;the IntelliJ IDEA Community Edition site&lt;/a&gt;. &lt;p&gt;The IntelliJ platform, the common foundation for all our IDEs (IDEA, RubyMine, WebIDE or MPS), is being open-sourced under the APL 2.0, too.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Das Video &lt;a title="http://www.jetbrains.com/idea/training/demos/CE/introduction_to_community_edition.html" href="http://www.jetbrains.com/idea/training/demos/CE/introduction_to_community_edition.html"&gt;http://www.jetbrains.com/idea/training/demos/CE/introduction_to_community_edition.html&lt;/a&gt; stellt die Community Edition kurz in einem Video vor.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-1116711523623942792?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/1116711523623942792/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=1116711523623942792" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/1116711523623942792" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/1116711523623942792" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/tsgnKYDmLc0/teil-von-intellij-idea-wird-open-source.html" title="Teil von IntelliJ IDEA wird Open-Source" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/10/teil-von-intellij-idea-wird-open-source.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2823078590393298863</id><published>2009-10-15T21:31:00.001+02:00</published><updated>2009-11-08T08:23:31.908+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><title type="text">GWT-Bibliotheken</title><content type="html">&lt;p&gt;&lt;a title="http://code.google.com/p/kiyaa/" href="http://code.google.com/p/kiyaa/"&gt;http://code.google.com/p/kiyaa/&lt;/a&gt;. Leistungsfähiges XHTML-Template Framework. Bis zum Google UI-Binder ist a) noch Zeit und b) nutzt Kiyaa einfaches XHTML, was man mit jedem HTML-Editor editieren auf aufbauen kann.&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/gwt-mosaic/" href="http://code.google.com/p/gwt-mosaic/"&gt;http://code.google.com/p/gwt-mosaic/&lt;/a&gt;. “GWT Mosaic is a highly usable, feature rich toolkit for creating Rich Internet Applications and an easy to use API.” &lt;a title="http://69.20.122.77/gwt-mosaic/Showcase.html" href="http://69.20.122.77/gwt-mosaic/Showcase.html"&gt;http://69.20.122.77/gwt-mosaic/Showcase.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/cobogw/" href="http://code.google.com/p/cobogw/"&gt;http://code.google.com/p/cobogw/&lt;/a&gt;. In erster Linie Buttons, Button-Gruppen, runde Panels, Rating-Widget. &lt;a href="http://cobogw.googlecode.com/svn/trunk/widgets/samples/WidgetsDemo/www/org.cobogw.gwt.demo.widgets.WidgetsDemo/WidgetsDemo.html#Button"&gt;Demo&lt;/a&gt;. Weiterhin “GWT emulation of java.sql”, also von Date, Time, Timestamp&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.asquare.net/gwttk/" href="http://www.asquare.net/gwttk/"&gt;http://www.asquare.net/gwttk/&lt;/a&gt;. &lt;a href="http://www.asquare.net/gwttk/apps/demo/Demo.html"&gt;Demo&lt;/a&gt;. Seit 2007 kein neues Release&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/gwtlib/" href="http://code.google.com/p/gwtlib/"&gt;http://code.google.com/p/gwtlib/&lt;/a&gt;. MenuBar, PagingBar, Table, PagingTable und StyleListBox. Table hat Renderer. Aktuell&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/gwt-masterview/" href="http://code.google.com/p/gwt-masterview/"&gt;http://code.google.com/p/gwt-masterview/&lt;/a&gt;. “GWT-Masterview library is an extension to Google Web Toolkit that provides widgets to filter, sort and paginate your data”&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/gwtchismes/" href="http://code.google.com/p/gwtchismes/"&gt;http://code.google.com/p/gwtchismes/&lt;/a&gt;. &lt;a href="http://gwtchismes.googlecode.com/svn/trunk/website/sample/GWTCSample.html"&gt;Demo&lt;/a&gt;. Rendert nicht ganz sauber die Buttons&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/gwt-beans-binding/" href="http://code.google.com/p/gwt-beans-binding/"&gt;http://code.google.com/p/gwt-beans-binding/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/gwt-table/" href="http://code.google.com/p/gwt-table/"&gt;http://code.google.com/p/gwt-table/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/gwt-datepicker/" href="http://code.google.com/p/gwt-datepicker/"&gt;http://code.google.com/p/gwt-datepicker/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/guwit/" href="http://code.google.com/p/guwit/"&gt;http://code.google.com/p/guwit/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://gwt-widget.sourceforge.net/" href="http://gwt-widget.sourceforge.net/"&gt;http://gwt-widget.sourceforge.net/&lt;/a&gt;. Besteht aus GWT Server Library (GWT-SL) und GWT Widget Library (GWT-WL). &lt;a title="http://gwt-widget.sourceforge.net/demo/calc/index.html" href="http://gwt-widget.sourceforge.net/demo/calc/index.html"&gt;http://gwt-widget.sourceforge.net/demo/calc/index.html&lt;/a&gt; zeigt einen kleinen Taschenrechner, kann mal praktisch sein… (bin ich zynisch?) Der letzte &lt;a href="http://gwtwidgets.blogspot.com/"&gt;Blog-Eintrag&lt;/a&gt; endete vor exakt 3 Jahren.&lt;/p&gt; &lt;p&gt;&lt;a title="http://gwt-vl.sourceforge.net/" href="http://gwt-vl.sourceforge.net/"&gt;http://gwt-vl.sourceforge.net/&lt;/a&gt;. GWT Validation Library&lt;/p&gt; &lt;p&gt;&lt;a href="http://raibledesigns.com/rd/entry/creating_a_facebook_style_autocomplete"&gt;http://raibledesigns.com/rd/entry/creating_a_facebook_style_autocomplete&lt;/a&gt;&amp;nbsp; &lt;p&gt;Noch mehr: &lt;a title="http://google.wikia.com/wiki/Google_Web_Toolkit#Widgets" href="http://google.wikia.com/wiki/Google_Web_Toolkit#Widgets"&gt;http://google.wikia.com/wiki/Google_Web_Toolkit#Widgets&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Fehlt was?&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-2823078590393298863?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/2823078590393298863/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=2823078590393298863" title="2 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2823078590393298863" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2823078590393298863" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/TNQE2PupQnc/gwt-bibliotheken.html" title="GWT-Bibliotheken" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/10/gwt-bibliotheken.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-4355600575942631400</id><published>2009-10-15T20:23:00.001+02:00</published><updated>2009-10-15T20:23:35.275+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java 7" /><title type="text">Java 7 bringt binary literals und Underscores in literals</title><content type="html">&lt;p&gt;Im Build &lt;a title="http://download.java.net/jdk7/changes/jdk7-b73.html" href="http://download.java.net/jdk7/changes/jdk7-b73.html"&gt;http://download.java.net/jdk7/changes/jdk7-b73.html&lt;/a&gt; gibt es noch mehr, aber diese beiden Änderungen betreffen die Sprache:  &lt;ul&gt; &lt;li&gt;&lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6860965"&gt;6860965&lt;/a&gt;. Project Coin: binary literals. &lt;a title="http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000929.html" href="http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000929.html"&gt;http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000929.html&lt;/a&gt;  &lt;li&gt;&lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6860973"&gt;6860973&lt;/a&gt;. Project Coin: Underscores in literals. &lt;a title="http://mail.openjdk.java.net/pipermail/coin-dev/2009-April/001628.html" href="http://mail.openjdk.java.net/pipermail/coin-dev/2009-April/001628.html"&gt;http://mail.openjdk.java.net/pipermail/coin-dev/2009-April/001628.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-4355600575942631400?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/4355600575942631400/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=4355600575942631400" title="1 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/4355600575942631400" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/4355600575942631400" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/NAVuaWUNjBs/java-7-bringt-binary-literals-und.html" title="Java 7 bringt binary literals und Underscores in literals" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/10/java-7-bringt-binary-literals-und.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2439480580546652796</id><published>2009-10-14T12:03:00.005+02:00</published><updated>2009-10-14T12:19:13.695+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><title type="text">guava-libraries -- Guava: Google Core Libraries for Java</title><content type="html">Wer von den ganzen Apache Commons * noch immer nicht genug hat, kann einen Blick auf &lt;a href="http://code.google.com/p/guava-libraries/"&gt;http://code.google.com/p/guava-libraries/&lt;/a&gt; werden. Lauf Webseite "This project contains several of Google's core Java libraries that we use in our myriad Java projects." Die Folien (&lt;a href="http://guava-libraries.googlecode.com/files/Guava_a_sketchy_overview.pdf"&gt;http://guava-libraries.googlecode.com/files/Guava_a_sketchy_overview.pdf&lt;/a&gt;) geben Beispiele für einige Pakete der Libs:&lt;br /&gt;&lt;br /&gt;&lt;table summary="" border="1" cellpadding="3" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr class="TableRowColor" bgcolor="white"&gt;&lt;td width="20%"&gt;&lt;b&gt;&lt;a href="http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/package-summary.html"&gt;com.google.common.base&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr class="TableRowColor" bgcolor="white"&gt; &lt;td width="20%"&gt;&lt;b&gt;&lt;a href="http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/package-summary.html"&gt;com.google.common.io&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr class="TableRowColor" bgcolor="white"&gt; &lt;td width="20%"&gt;&lt;b&gt;&lt;a href="http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/primitives/package-summary.html"&gt;com.google.common.primitives&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr class="TableRowColor" bgcolor="white"&gt; &lt;td width="20%"&gt;&lt;b&gt;&lt;a href="http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/util/concurrent/package-summary.html"&gt;com.google.common.util.concurrent&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Mir gefällt besonders gut, das moderne API-Design. Ein Blick ist es wert! Die Doku gibt es unter &lt;a href="http://guava-libraries.googlecode.com/svn/trunk/javadoc/index.html"&gt;http://guava-libraries.googlecode.com/svn/trunk/javadoc/index.html&lt;/a&gt;. Die Folien versprechen auch eine Unterstützdung von GWT -- das wäre wirklich interessant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-2439480580546652796?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/2439480580546652796/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=2439480580546652796" title="2 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2439480580546652796" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2439480580546652796" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/DBgFLpsHvoc/guava-libraries-guava-google-core.html" title="guava-libraries -- Guava: Google Core Libraries for Java" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/10/guava-libraries-guava-google-core.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2959830751804626139</id><published>2009-10-13T07:33:00.002+02:00</published><updated>2009-10-13T07:37:25.651+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Frameworks" /><title type="text">GWT 2.0 Milestone 1</title><content type="html">Im GWT-Forum wurde letzte Woche der erste Milestone von GWT 2.0 angekündigt:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Things that are changing with GWT 2.0 that might otherwise be confusing without explanation&lt;br /&gt;&lt;p&gt; * Terminology changes: We're going to start using the term&lt;br /&gt;"development mode" rather than the old term "hosted mode." The term&lt;br /&gt;"hosted mode" was sometimes confusing to people, so we'll be using the&lt;br /&gt;more descriptive term from now on. For similar reasons, we'll be using&lt;br /&gt;the term "production mode" rather than "web mode" when referring to&lt;br /&gt;compiled script.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* Changes to the distribution: Note that there's only one download,&lt;br /&gt;and it's no longer platform-specific. You download the same zip file&lt;br /&gt;for every development platform. This is made possible by the new&lt;br /&gt;plugin approach used to implement development mode (see below). The&lt;br /&gt;distribution file does not include the browser plugins themselves;&lt;br /&gt;those are downloaded separately the first time you use development&lt;br /&gt;mode in a browser that doesn't have the plugin installed.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Functionality that will be coming in GWT 2.0&lt;br /&gt;* In-Browser Development Mode: Prior to 2.0, GWT hosted mode provided&lt;br /&gt;a special-purpose "hosted browser" to debug your GWT code. In 2.0, the&lt;br /&gt;web page being debugged is viewed within a regular-old browser.&lt;br /&gt;Development mode is supported through the use of a native-code plugin&lt;br /&gt;for each browser. In other words, you can use development mode&lt;br /&gt;directly from Safari, Firefox, IE, and Chrome.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* Code Splitting: Developer-guided code splitting allows you to chunk&lt;br /&gt;your GWT code into multiple fragments for faster startup. Imagine&lt;br /&gt;having to download a whole movie before being able to watch it. Well,&lt;br /&gt;that's what you have to do with most Ajax apps these days -- download&lt;br /&gt;the whole thing before using it. With code splitting, you can arrange&lt;br /&gt;to load just the minimum script needed to get the application running&lt;br /&gt;and the user interacting, while the rest of the app is downloaded as&lt;br /&gt;needed.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* Declarative User Interface: GWT's UiBinder now allows you to create&lt;br /&gt;user interfaces mostly declaratively. Previously, widgets had to be&lt;br /&gt;created and assembled programmatically, requiring lots of code. Now,&lt;br /&gt;you can use XML to declare your UI, making the code more readable,&lt;br /&gt;easier to maintain, and faster to develop. The Mail sample has been&lt;br /&gt;updated to use the new declarative UI.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* Bundling of resources (ClientBundle): GWT has shipped with&lt;br /&gt;ImageBundles since GWT v1.4, giving developers automatic spriting of&lt;br /&gt;images. ClientBundle generalizes this technique, bringing the power of&lt;br /&gt;combining and optimizing resources into one download to things like&lt;br /&gt;text files, CSS, and XML. This means fewer network round trips, which&lt;br /&gt;in turn can decrease application latency -- especially on mobile&lt;br /&gt;applications.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* Using HtmlUnit for running GWT tests: GWT 2.0 no longer uses SWT or&lt;br /&gt;the old mozilla code (on linux) to run GWT tests. Instead, it uses&lt;br /&gt;HtmlUnit as the built-in browser. HtmlUnit is 100% Java. This means&lt;br /&gt;there is a single GWT distribution for linux, mac, and windows, and&lt;br /&gt;debugging GWT Tests in development mode can be done entirely in a Java&lt;br /&gt;debugger.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Known issues&lt;br /&gt;*  If you are planning to run the webAppCreator, i18nCreator, or the&lt;br /&gt;junitCreator scripts on Mac or Linux, please set their executable bits&lt;br /&gt;by doing a 'chmod +x *Creator'&lt;br /&gt;* Our HtmlUnit integration is still not complete. Additionally,&lt;br /&gt;HtmlUnit does not do layout. So tests can fail either because they&lt;br /&gt;exercise layout or they hit bugs due to incomplete integration. If you&lt;br /&gt;want such tests to be ignored on HtmlUnit, please annotate the test&lt;br /&gt;methods with @DoNotRunWith({Platform.Htmlunit})&lt;br /&gt;* The Google Eclipse Plugin will only allow you to add GWT release&lt;br /&gt;directories that include a file with a name like gwt-dev-windows.jar.&lt;br /&gt;You can fool it by sym linking or copying gwt-dev.jar to the&lt;br /&gt;appropriate name.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Breaking changes&lt;br /&gt;* The way arguments are passed to the GWT testing infrastructure has&lt;br /&gt;been revamped. There is now a consistent syntax to support arbitrary&lt;br /&gt;"runstyles", including user-written with no changes to GWT.  Though&lt;br /&gt;this does not affect common launch configs, some of the less common&lt;br /&gt;ones will need to be updated. For example, '-selenium FF3' has become&lt;br /&gt;'-runStyle selenium:FF3'&lt;br /&gt;&lt;/p&gt;As always, remember that GWT milestone builds like this are use-at-&lt;br /&gt;your-own-risk and we don't recommend it for production use. Please&lt;br /&gt;report any bugs you encounter to the GWT issue tracker (http://&lt;br /&gt;code.google.com/p/google-web-toolkit/issues/list) after doing a quick&lt;br /&gt;search to see if your issue has already been reported.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Download unter &lt;a href="http://code.google.com/p/google-web-toolkit/downloads/list?can=1&amp;amp;q=gwt+2.0&amp;amp;colspec=Filename+Summary+Uploaded+Size+DownloadCount"&gt;http://code.google.com/p/google-web-toolkit/downloads/list?can=1&amp;amp;q=gwt+2.0&amp;amp;colspec=Filename+Summary+Uploaded+Size+DownloadCount&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-2959830751804626139?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="related" href="http://groups.google.com/group/google-web-toolkit/browse_thread/thread/8b79ebe444b9126d?hl=en&amp;pli=1" title="GWT 2.0 Milestone 1" /><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/2959830751804626139/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=2959830751804626139" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2959830751804626139" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/2959830751804626139" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/2TJ27v5YRcU/gwt-20-milestone-1.html" title="GWT 2.0 Milestone 1" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/10/gwt-20-milestone-1.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7009079191154607971</id><published>2009-09-22T08:53:00.003+02:00</published><updated>2009-09-22T08:57:55.219+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Swing" /><title type="text">Neuer Gui-Builder GUIDE -- sehr gut</title><content type="html">&lt;a href="http://www.mindsilver.com/"&gt;Mindsilver &lt;/a&gt;entwickelt eine neuen Gui-Builder für Swing-Anwendungen, der irgendwie an Matisse erinnert, aber doch mit automatischen Controllern weit über Matisse herausragt. Unter &lt;a href="http://www.mindsilver.com/"&gt;http://www.mindsilver.com/&lt;/a&gt; gibt es ein Demo. Hervorragend ist der konsequente Einsatz von Drag &amp;amp; Drop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-7009079191154607971?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/7009079191154607971/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=7009079191154607971" title="3 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/7009079191154607971" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/7009079191154607971" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/EIpbanDXIYY/neuer-gui-builder-guide-sehr-gut.html" title="Neuer Gui-Builder GUIDE -- sehr gut" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/09/neuer-gui-builder-guide-sehr-gut.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-1015988424706365419</id><published>2009-09-21T08:30:00.003+02:00</published><updated>2009-11-08T08:22:54.902+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Entwicklungsumgebung" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><title type="text">Eclipse 3.6 M2</title><content type="html">Eclipse 3.6 wurde auf den Milestone 2 gebracht. Die &lt;a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.6M2-200909170100/eclipse-news-M2.html"&gt;News&lt;/a&gt; sind für Java-Entwickler enttäuschend, denn es gibt keine wirklichen Änderungen in der JDT.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-1015988424706365419?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/1015988424706365419/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=1015988424706365419" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/1015988424706365419" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/1015988424706365419" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/9_4h-NrfH9Q/eclipse-36-m2.html" title="Eclipse 3.6 M2" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/09/eclipse-36-m2.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-1597304117896574664</id><published>2009-09-20T21:33:00.002+02:00</published><updated>2009-09-20T21:37:35.929+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java 7" /><title type="text">Erste Sprachänderung in Java 7</title><content type="html">Die Diamand-Schreibweise zur Abkürzung von generischen Instanziierungen ist in Java 7 Build 72 eingegangen.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6840638&lt;/li&gt;&lt;li&gt;http://download.java.net/jdk7/changes/jdk7-b72.html&lt;/li&gt;&lt;li&gt;http://download.java.net/jdk7/&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-1597304117896574664?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/1597304117896574664/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=1597304117896574664" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/1597304117896574664" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/1597304117896574664" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/tHMqsI9mNU0/erste-sprachanderung-in-java-7.html" title="Erste Sprachänderung in Java 7" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/09/erste-sprachanderung-in-java-7.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-3700089819483027675</id><published>2009-09-18T10:03:00.004+02:00</published><updated>2009-09-18T10:10:03.214+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title type="text">Android 1.6</title><content type="html">Zentrale Informationen über &lt;a href="http://developer.android.com/sdk/android-1.6.html"&gt;Google Android 1.6&lt;/a&gt; kann man auch den &lt;a href="http://news.google.de/news/search?um=1&amp;amp;ned=de&amp;amp;hl=de&amp;amp;q=android+1.6"&gt;deutschen  News&lt;/a&gt; entnehmen. Interessant sind eine zentrale Suche, so eine Art Mac OS Spotlight, schnellere Kamerabilder und weitere Optimierungen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-3700089819483027675?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/3700089819483027675/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=3700089819483027675" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/3700089819483027675" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/3700089819483027675" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/vOZ-mklKTVE/android-16.html" title="Android 1.6" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/09/android-16.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-6369201345501377474</id><published>2009-09-10T10:31:00.001+02:00</published><updated>2009-09-10T10:31:39.949+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Frameworks" /><title type="text">Google App Engine SDK 1.2.5</title><content type="html">&lt;p&gt;Das Update bringt interessante Neuerungen. Dazu zählen XMPP-Unterstützung. &lt;a title="http://code.google.com/intl/de/appengine/docs/java/xmpp/" href="http://code.google.com/intl/de/appengine/docs/java/xmpp/"&gt;http://code.google.com/intl/de/appengine/docs/java/xmpp/&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;An App Engine application can send and receive instant messages to and from any XMPP-compatible instant messaging service, such as &lt;a href="http://www.google.com/talk/"&gt;Google Talk&lt;/a&gt;. An app can send and receive chat messages, send chat invites, and request status information. Incoming XMPP messages are handled by request handlers, similar to web requests.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Für Python gab es schon eine API für Aufgaben, die offline abgearbeitet werden konnten. Das gibt es es nun auch für Java, &lt;a title="http://code.google.com/intl/de/appengine/docs/java/taskqueue/overview.html" href="http://code.google.com/intl/de/appengine/docs/java/taskqueue/overview.html"&gt;http://code.google.com/intl/de/appengine/docs/java/taskqueue/overview.html&lt;/a&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;With the Task Queue API, applications can perform work outside of a user request but initiated by a user request. If an app needs to execute some background work, it may use the Task Queue API to organize that work into small, discrete units, called Tasks. The app then inserts these Tasks into one or more Queues. App Engine automatically detects new Tasks and executes them when system resources permit.&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-6369201345501377474?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/6369201345501377474/comments/default" title="Kommentare zum Post" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=18862554&amp;postID=6369201345501377474" title="0 Kommentare" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/6369201345501377474" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/18862554/posts/default/6369201345501377474" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javainsel/~3/lphVIdM-QII/google-app-engine-sdk-125.html" title="Google App Engine SDK 1.2.5" /><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="01526790562813987856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.tutego.com/blog/javainsel/2009/09/google-app-engine-sdk-125.html</feedburner:origLink></entry></feed>
