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

<channel>
	<title>javathreads.de &#187; Java Tipp</title>
	<atom:link href="http://javathreads.de/tag/java-tipp/feed/" rel="self" type="application/rss+xml" />
	<link>http://javathreads.de</link>
	<description>Blog rund um Java und Web Entwicklung</description>
	<lastBuildDate>Wed, 02 Nov 2011 10:37:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Die &#8220;Double Brace Initialization&#8221; zum Initialisieren von Listen, Maps oder Sets</title>
		<link>http://javathreads.de/2009/05/die-double-brace-initialization-zum-initialisieren-von-listen-maps-oder-sets/</link>
		<comments>http://javathreads.de/2009/05/die-double-brace-initialization-zum-initialisieren-von-listen-maps-oder-sets/#comments</comments>
		<pubDate>Thu, 28 May 2009 06:00:16 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Initialisierung]]></category>
		<category><![CDATA[Java Tipp]]></category>
		<category><![CDATA[List]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[Set]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=1426</guid>
		<description><![CDATA[Einen wirklich interessanten Ansatz eine Liste, Map oder Set mit Werten zu initialisieren wenn diese statisch ist oder man eine diese einer Methode &#252;bergeben m&#246;chte habe ich mit dem Namen &#8220;Double Brace Initialization&#8221; auf 2c.com Java Idioms gefunden.
Im folgenden der Java Schnipsel wie man eine statische Liste initialisieren w&#252;rde:

private static final Set VALID_CODES = new [...]]]></description>
			<content:encoded><![CDATA[<p>Einen wirklich interessanten Ansatz eine Liste, Map oder Set mit Werten zu initialisieren wenn diese statisch ist oder man eine diese einer Methode &#252;bergeben m&#246;chte habe ich mit dem Namen &#8220;<a href="http://www.c2.com/cgi/wiki?DoubleBraceInitialization">Double Brace Initialization</a>&#8221; auf <a href="http://www.c2.com/cgi/wiki?JavaIdioms">2c.com Java Idioms</a> gefunden.</p>
<p>Im folgenden der Java Schnipsel wie man eine statische Liste initialisieren w&#252;rde:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#7F0074;"><b>private</b></span> <span style="color:#7F0074;"><b>static</b></span> <span style="color:#7F0074;"><b>final</b></span> Set<String> VALID_CODES = <span style="color:#7F0074;"><b>new</b></span> HashSet<String>();
<span style="color:#7F0074;"><b>static</b></span> {
  validCodes.add(<span style="color:#2A00FF;">"XZ13s"</span>);
  validCodes.add(<span style="color:#2A00FF;">"AB21/X"</span>);
  validCodes.add(<span style="color:#2A00FF;">"YYLEX"</span>);
  validCodes.add(<span style="color:#2A00FF;">"AR2D"</span>);
}</pre>
</div>
<p>Mit der &#8220;Double Brace Initialization&#8221; sieht dieser Schnipsel nun wie eine Expression aus:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#7F0074;"><b>private</b></span> <span style="color:#7F0074;"><b>static</b></span> <span style="color:#7F0074;"><b>final</b></span> Set<String> VALID_CODES = <span style="color:#7F0074;"><b>new</b></span> HashSet<String>() {{
  add(<span style="color:#2A00FF;">"XZ13s"</span>);
  add(<span style="color:#2A00FF;">"AB21/X"</span>);
  add(<span style="color:#2A00FF;">"YYLEX"</span>);
  add(<span style="color:#2A00FF;">"AR2D"</span>);
}};</pre>
</div>
<p>Ein h&#228;ufiger auftretendes Problem ist aber das Initialisieren einer Liste, Map oder Set wenn diese als Methodenparameter &#252;bergeben werden soll. In der Regel sieht das dann in etwas so aus:</p>
<div class="codebox">
<pre style="margin:0;padding:0">Set<String> validCodes = <span style="color:#7F0074;"><b>new</b></span> HashSet<String>();
validCodes.add(<span style="color:#2A00FF;">"XZ13s"</span>);
validCodes.add(<span style="color:#2A00FF;">"AB21/X"</span>);
validCodes.add(<span style="color:#2A00FF;">"YYLEX"</span>);
validCodes.add(<span style="color:#2A00FF;">"AR2D"</span>);
removeProductsWithCodeIn(validCodes);</pre>
</div>
<p>Mit der neuen Schreibweise verk&#252;rzt sich dieses St&#252;cken Code auf eine Zeile:</p>
<div class="codebox">
<pre style="margin:0;padding:0">removeProductsWithCodeIn(<span style="color:#7F0074;"><b>new</b></span> HashSet<String>() {{
  add(<span style="color:#2A00FF;">"XZ13s"</span>);
  add(<span style="color:#2A00FF;">"AB21/X"</span>);
  add(<span style="color:#2A00FF;">"YYLEX"</span>);
  add(<span style="color:#2A00FF;">"AR5E"</span>);
}});</pre>
</div>
<p>Letztlich ist diese Art des initialen Bef&#252;llens nicht wirklich etwas Besonderes &#8211; zumindest aus Java Sicht . Die erste Klammer aus der &#8220;double brace initialization&#8221; erstellt eine anonyme Klasse und die zweite einen Initialisierungsblock innerhalb der anonymen Klasse. Es wird also ganz normale Java Technik verwendet lediglich die neue Art der Schreibweise ist mal etwas anderes.</p>
<p>Nun noch abschlie&#223;end die wirklich brauchbare Info, dass man sehr einfach eine Liste mit <code>Arrays.asList()</code> initialisieren kann:</p>
<div class="codebox">
<pre style="margin:0;padding:0">List<String> myList = <span style="color:#7F0074;"><b>new</b></span> ArrayList<String>(Arrays.asList(<span style="color:#2A00FF;">"One"</span>, <span style="color:#2A00FF;">"Two"</span>, <span style="color:#2A00FF;">"Three"</span>));</pre>
</div>
<p>Diese Hilfsmethode <code>Arrays.asList()</code> sollte man sich also <a href="http://java-schnipsel.de/snippet/liste-mit-arraysaslist-initialisieren--sid72">merken</a>.</p>
<p>Wie auch immer man eine Liste initialisiert &#8211; die &#8220;Double Brace Initiliazation&#8221; ist mal eine andere Art =)</p>
<p><small>(Alle Beispiele wurden eins zu eins aus dem entsprechenden Artikel auf <a href="http://www.c2.com/cgi/wiki?DoubleBraceInitialization">2c.com</a> &#252;bernommen)</small></p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/05/die-double-brace-initialization-zum-initialisieren-von-listen-maps-oder-sets/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java enums mit == oder .equals() auf Gleichheit pr&#252;fen?</title>
		<link>http://javathreads.de/2009/05/java-enums-mit-oder-equals-auf-gleichheit-pruefen/</link>
		<comments>http://javathreads.de/2009/05/java-enums-mit-oder-equals-auf-gleichheit-pruefen/#comments</comments>
		<pubDate>Fri, 15 May 2009 07:00:07 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[enum]]></category>
		<category><![CDATA[Java Tipp]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=1507</guid>
		<description><![CDATA[Die Frage wie man die in Java 5 eingef&#252;hrten enum Typen am besten auf Gleichheit pr&#252;ft scheint durchaus berechtigt. Wird man doch oft genug ger&#252;gt und gemahnt in Java nie mit == sondern immer mit .equals()auf Gleichheit zu pr&#252;fen. Diese Aussage l&#228;sst sich auch leicht mit z.B. zwei Interger Objekten &#252;berpr&#252;fen, wie der folgende Schnipsel [...]]]></description>
			<content:encoded><![CDATA[<p>Die Frage wie man die in Java 5 eingef&#252;hrten <code>enum</code> Typen am besten auf Gleichheit pr&#252;ft scheint durchaus berechtigt. Wird man doch oft genug ger&#252;gt und gemahnt in Java nie mit <code>==</code> sondern immer mit <code>.equals()</code>auf Gleichheit zu pr&#252;fen. Diese Aussage l&#228;sst sich auch leicht mit z.B. zwei Interger Objekten &#252;berpr&#252;fen, wie der folgende Schnipsel zeigt:</p>
<div class="codebox">
<pre style="margin:0;padding:0">Integer i1 = <span style="color:#7F0074;"><b>new</b></span> Integer(2);
Integer i2 = <span style="color:#7F0074;"><b>new</b></span> Integer(2);

System.out.println(i1 == i2);      <span style="color:#3F7F5F">// Ausgabe: false</span>
System.out.println(i1.equals(i2)); <span style="color:#3F7F5F">// Ausgabe: true</span></pre>
</div>
<p>Nun aber die Frage nach dem &#220;berpr&#252;fen eines enums. Hat man z.B. folgendes Java <code>enum</code>:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#7F0074;"><b>public</b></span> <span style="color:#7F0074;"><b>enum</b></span> EnumEqualTest {
  EINS, ZWEI, DREI;
}</pre>
</div>
<p>Und anschlie&#223;end wieder die folgende Gleichheitsabfrage mit dem <code>System.out</code>:</p>
<div class="codebox">
<pre style="margin:0;padding:0">EnumEqualTest e1 = EnumEqualTest.ZWEI;
EnumEqualTest e2 = EnumEqualTest.ZWEI;

System.out.println(e1 == e2);      <span style="color:#3F7F5F">// Ausgabe: true</span>
System.out.println(e1.equals(e2)); <span style="color:#3F7F5F">// Ausgabe: true</span></pre>
</div>
<p>Beide <code>System.out</code>&#8217;s geben <code>true</code> aus. Der Test zeigt also, dass die &#220;berpr&#252;fung mit <code>==</code> f&#252;r <code>enum</code> Typen funktioniert. Jetzt stellt sich nur noch die Frage ob das auch empfohlen ist. &#196;hnlich wie bei Strings k&#246;nnte es ja durch die besondere Behandlung des <code>enum</code> Typs &#8220;zuf&#228;llig&#8221; funktionieren.</p>
<p>Um das ganze kurz zu machen: Enum Konstanten sind implizit <code>public static final</code> und somit statische Variablen. Statische Variablen geh&#246;ren zur Klasse, werden daher mit der Klasse selbst im Heap abgelegt und haben immer die gleiche Referenz. Aus diesem Grund kann man auf die statischen Variablen auch immer nur &#252;ber die Klasse gelangen wie z.B. <code>EnumEqualTest.ZWEI</code>. Das ist auch der Grund warum man auch mit dem <code>==</code> Operator die Gleichheit &#252;berpr&#252;fen kann.</p>
<p>Schaut man sich im Quellcode des <code>enum</code> Typs die methode <code>equals()</code> mal genauer an sieht man neben der <code>final</code> Deklaration auch, dass <code>equals()</code> selbst mit dem <code>==</code> Operator die Gleichheit pr&#252;ft:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/05/enumclassequals.png" alt="enum.equals() Methode" title="enum.equals() Methode" width="600" height="80" class="alignnone size-full wp-image-1511" />
</div>
<p>Somit ist es eigentlich total egal f&#252;r welche Variante man sich entscheidet den beide m&#252;nden im <code>==</code> Operator Ausdruck.<br />
Einen nennenswerten gro&#223;en Vorteil hat allerdings die Variante direkt mit dem <code>==</code> Operator zu arbeiten: Der Compiler erkennt wenn die Typen nicht zueinander passen:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/05/enumequalscompilerfehler.png" alt="enum equals Compiler Fehler" title="enum equals Compiler Fehler" width="600" height="106" class="alignnone size-full wp-image-1523" />
</div>
<p>Es erscheint der Compiler Fehler &#8220;<code>Incompatible operand types ... and ...</code>&#8220;. Somit erspart man sich l&#228;stige Fehler die sp&#228;ter gesucht werden m&#252;ssen.</p>
<p>Nun ist die Erl&#228;uterung auf die Frage nach der besseren Variante der Gleichheit&#252;berpr&#252;fung von <code>enum</code> Typen doch etwas l&#228;nger ausgefallen =).</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/05/java-enums-mit-oder-equals-auf-gleichheit-pruefen/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Niemals mit den Datentypen Float oder Double Geldbetr&#228;ge berechnen!</title>
		<link>http://javathreads.de/2009/03/niemals-mit-den-datentypen-float-oder-double-geldbetraege-berechnen/</link>
		<comments>http://javathreads.de/2009/03/niemals-mit-den-datentypen-float-oder-double-geldbetraege-berechnen/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 06:00:46 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Double]]></category>
		<category><![CDATA[Effective Java]]></category>
		<category><![CDATA[Float]]></category>
		<category><![CDATA[Genauigkeit]]></category>
		<category><![CDATA[Java Tipp]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=954</guid>
		<description><![CDATA[Das jedenfalls zeigt eine Rechnung die Michael Haupt erhalten und unter dem Titel &#8220;Ich bin reich!&#8221; ver&#246;ffentlicht hat:



Auf der Rechnung ist sch&#246;n zu erkennen, dass 38,29 EUR &#8211; 38,29 EUR nicht immer 0 ergeben. Jedenfalls dann nicht, wenn man mit Flie&#223;kommazahlen rechnet. Und da der ausgewiesene Restbetrag negativ ist steht jemand gewaltig bei Michael Haupt [...]]]></description>
			<content:encoded><![CDATA[<p>Das jedenfalls zeigt eine Rechnung die <a href="haupz.blogspot.com">Michael Haupt</a> erhalten und unter dem Titel &#8220;<a href="http://haupz.blogspot.com/2009/01/ich-bin-reich.html">Ich bin reich!</a>&#8221; ver&#246;ffentlicht hat:</p>
<div class="singleImgDiv">
<a href="http://haupz.blogspot.com/2009/01/ich-bin-reich.html"><img src="http://javathreads.de/data/uploads/2009/02/floatrechnungausschnitt.jpg" alt="Rechnung Ausschnitt" title="Michael Haupt - ich bin reich!" width="600" height="269" class="borderGray alignnone size-full wp-image-1101" /></a>
</div>
<p>Auf der Rechnung ist sch&#246;n zu erkennen, dass 38,29 EUR &#8211; 38,29 EUR nicht immer 0 ergeben. Jedenfalls dann nicht, wenn man mit Flie&#223;kommazahlen rechnet. Und da der ausgewiesene Restbetrag negativ ist steht jemand gewaltig bei Michael Haupt in den Miesen. Dieser hat diese Tatsache wiederum dem Rechnungsschreiber auch umgehend in einem Brief mitgeteilt:</p>
<blockquote><p>
Der offene Restbetrag ist mit EUR -7,11*10^15 ausgewiesen. Da es sich hierbei um einen negativen Betrag handelt, stehen Sie bei mir in der Schuld. Ich hege Zweifel daran, dass Sie 7,11 Billiarden Euro auf einen Schlag aufbringen k&#246;nnen; wir k&#246;nnen uns gern auf eine Ratenzahlung einigen.
</p></blockquote>
<p>Generell sollte man sich aus diesem Beispiel mitnehmen, dass bei der Berechnung von Flie&#223;kommazahlen Rundungsfehler entstehen k&#246;nnen. Das kann man sogar relativ einfach in einem kleinen Beispiel nachstellen:</p>
<div class="codebox">
<pre style="margin:0;padding:0">System.out.println(<span style="color:#2A00FF;">"1.0 - 1.0 = "</span> + <span style="color:#7F0074;"><b>new</b></span>&#160;Double(1.0 - 1.0));
System.out.println(<span style="color:#2A00FF;">"1.0 - 0.9 = "</span> + <span style="color:#7F0074;"><b>new</b></span>&#160;Double(1.0 - 0.9));
System.out.println(<span style="color:#2A00FF;">"1.0 - 0.8 = "</span> + <span style="color:#7F0074;"><b>new</b></span>&#160;Double(1.0 - 0.8));
System.out.println(<span style="color:#2A00FF;">"1.0 - 0.7 = "</span> + <span style="color:#7F0074;"><b>new</b></span>&#160;Double(1.0 - 0.7));
System.out.println(<span style="color:#2A00FF;">"1.0 - 0.6 = "</span> + <span style="color:#7F0074;"><b>new</b></span>&#160;Double(1.0 - 0.6));
System.out.println(<span style="color:#2A00FF;">"1.0 - 0.5 = "</span> + <span style="color:#7F0074;"><b>new</b></span>&#160;Double(1.0 - 0.5));

<span style="color:#3F7F5F">// Ausgabe:</span>
<span style="color:#3F7F5F">// 1.0 - 1.0 = 0.0 </span>
<span style="color:#3F7F5F">// 1.0 - 0.9 = 0.09999999999999998</span>
<span style="color:#3F7F5F">// 1.0 - 0.8 = 0.19999999999999996</span>
<span style="color:#3F7F5F">// 1.0 - 0.7 = 0.30000000000000004</span>
<span style="color:#3F7F5F">// 1.0 - 0.6 = 0.4</span>
<span style="color:#3F7F5F">// 1.0 - 0.5 = 0.5</span></pre>
</div>
<p>In dem Artikel von Michael Haupt wird auch noch auf die Regel 48 aus dem Buch &#8220;<a href="http://www.amazon.de/Effective-Java-Programming-Language-Guide/dp/0321356683/ref=sr_1_1?ie=UTF8&#038;s=books-intl-de&#038;qid=1236176622&#038;sr=8-1">Effective Java</a>&#8221; hingewiesen. Diese lautet &#8220;<strong>Item 48: Avoid float and double if exact answers are required</strong>&#8221; (siehe auch im <a href="http://java.sun.com/docs/books/effective/toc.html">Inhaltsverzeichnis</a>).</p>
<p>Aufgrund dieses Blog Artikels und anderen zuvor zuf&#228;llig gefundenen positiven Hinweisen auf das Buch &#8220;Effective Java&#8221; habe ich mir dieses zugelegt um die verschiedenen Empfehlungen mal durchzubl&#228;ttern. In dem besagten Item 48 wird ausf&#252;hrlich auf das Rundungsproblem bei Floats und Doubles eingegangen und unter anderem das folgende sehr sch&#246;ne Java Schnipsel gezeigt:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#7F0074;"><b>double</b></span>&#160;guthaben = 1.00;
<span style="color:#7F0074;"><b>int</b></span>&#160;gekaufteTeile = 0;

<span style="color:#7F0074;"><b>for</b></span>&#160;(<span style="color:#7F0074;"><b>double</b></span>&#160;preis = .10; guthaben &gt;= preis; preis += .10) {
  guthaben -= preis;
  gekaufteTeile++;
  System.out.println(<span style="color:#2A00FF;">"Preis: "</span> + preis);
  System.out.println(<span style="color:#2A00FF;">"Guthaben: "</span> + guthaben);
}
System.out.println(<span style="color:#2A00FF;">"Gekaufte Teile: "</span> + gekaufteTeile);
System.out.println(<span style="color:#2A00FF;">"Restgeld: "</span> + guthaben);

<span style="color:#3F7F5F">// Ausgaben:</span>
<span style="color:#3F7F5F">// Preis: 0.1</span>
<span style="color:#3F7F5F">// Guthaben: 0.9</span>
<span style="color:#3F7F5F">// Preis: 0.2</span>
<span style="color:#3F7F5F">// Guthaben: 0.7</span>
<span style="color:#3F7F5F">// Preis: 0.30000000000000004</span>
<span style="color:#3F7F5F">// Guthaben: 0.3999999999999999</span>
<span style="color:#3F7F5F">// Gekaufte Teile: 3</span>
<span style="color:#3F7F5F">// Restgeld: 0.3999999999999999</span></pre>
</div>
<p>In diesem Code Beispiel wird ein Betrag von einem Guthaben abgezogen und mit dem Restbetrag weitergerechnet wobei sich der Preis f&#252;r ein Teil erh&#246;ht. Dabei m&#252;sste man mit einem Guthaben von 1.0 und dem Preis und mit dem steigendem Preis von 0.10 exakt 4 Teile kaufen k&#246;nnen. Bei der ersten Iteration kostet das Teil 0.1, bei der zweiten 0.2, bei der dritten 0.3 und bei der vierten 0.4. Durch den besagten Rundungsfehler, welcher in dieser Schleife bei der dritten Iteration auftritt, kommt es nicht mehr zum Kauf des vierten Teils. Schlecht f&#252;r den Verk&#228;ufer denn er hat ein Teil weniger verkauft und schlecht f&#252;r den K&#228;ufer denn dieser hat jetzt einen kleineren Betrag als 4.0 am Ende raus (auch wenn die Differenz gegen 0 geht).</p>
<p>Somit gilt ganz allgemein der Hinweis: Entwickelt man eine Finanzsoftware sollte man im eigenen Interesse immer mit BigDecimal, Long oder Integer arbeiten!</p>
<p>Am Ende noch kurz der Hinweis darauf, dass es sich durchaus lohnt das Buch Effective Java einmal durchzubl&#228;ttern bzw. zu kaufen und ordentlich durchzulesen. Man kann sich dadurch einige Probleme ersparen und zudem noch die Qualit&#228;t des eigenen Codes verbessern.</p>
<p>(via <a href="http://denkspuren.blogspot.com/2009/01/let-it-float.html">denkspuren</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/03/niemals-mit-den-datentypen-float-oder-double-geldbetraege-berechnen/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

