{"id":2953,"date":"2014-09-26T19:38:32","date_gmt":"2014-09-26T17:38:32","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2953"},"modified":"2014-09-26T19:38:32","modified_gmt":"2014-09-26T17:38:32","slug":"doppelklammer-initialisierung","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2014\/09\/doppelklammer-initialisierung\/","title":{"rendered":"Doppelklammer-Initialisierung"},"content":{"rendered":"<p>Da anonyme Klassen keinen Namen haben, muss f\u00fcr Konstruktoren ein anderer Weg gefunden werden. Hier helfen Exemplarinitialisierungsbl\u00f6cke, also Bl\u00f6cke in geschweiften Klammern. <\/p>\n<p>Exemplarinitialisierer gibt es ja eigentlich gar nicht im Bytecode, sondern der Compiler setzt den Programmcode automatisch in jeden Konstruktor. Obwohl anonyme Klassen keinen direkten Konstruktor haben k\u00f6nnen, gelangt doch \u00fcber den Exemplarinitialisierer Programmcode in den Konstruktor der Bytecode-Datei. <\/p>\n<p>Dazu ein Beispiel: Die anonyme Klasse ist eine Unterklasse von Point und initialisiert im Konstruktor einen Punkt mit Zufallskoordinaten. Aus diesem speziellen Punkt-Objekt lesen wir dann die Koordinaten wieder aus: <\/p>\n<p>java.awt.Point p = new java.awt.Point() { <\/p>\n<p><b>{<\/b> <\/p>\n<p><b>x = (int)(Math.random() * 1000); y = (int)(Math.random() * 1000);<\/b> <\/p>\n<p><b>}<\/b> <\/p>\n<p>}; <\/p>\n<p>System.out.println( p.getLocation() ); \/\/ java.awt.Point[&#8230; <\/p>\n<p>System.out.println( new java.awt.Point( -1, 0 ) {{ <\/p>\n<p>y = (int)(Math.random() * 1000); <\/p>\n<p>}}.getLocation() ); \/\/ java.awt.Point[x=-1,y=&#8230;] <\/p>\n<p>Sprachlichkeit <\/p>\n<p>Wegen der beiden geschweiften Klammen hei\u00dft diese Variante auch Doppelklammer-Initialisierung (engl. Double Brace Initialization). <\/p>\n<p>Die Doppelklammer-Initialisierung ist kompakt, wenn etwas Datenstrukturen oder hierarchische Objekte initialisiert werden sollen. <\/p>\n<p>Beispiel * <\/p>\n<p>Im Folgenden Beispiel erwartet appendText(\u2026) ein Objekt vom Typ HashMap, was durch den Trick direkt initialisiert wird: <\/p>\n<p>String s = new DateTimeFormatterBuilder() <\/p>\n<p>.appendText( ChronoField.AMPM_OF_DAY, <\/p>\n<p><b>new HashMap&lt;Long, String&gt;() {{ put(0L, &#8222;fr\u00fch&#8220;);put(1L,&#8220;sp\u00e4t&#8220; ); }}<\/b> ) <\/p>\n<p>.toFormatter().format( LocalTime.now() ); <\/p>\n<p>System.out.println( s ); <\/p>\n<p>Im n\u00e4chsten Beispiel bauen wir eine geschachtelte Map, das ist ein Assoziativspeicher, der wieder einen anderen Assoziativspeicher enth\u00e4lt: <\/p>\n<p>Map&lt;String,Object&gt; map = new HashMap&lt;String,Object&gt;() {{ <\/p>\n<p>put( &#8222;name&#8220;, &#8222;Chris&#8220; ); <\/p>\n<p>put( &#8222;address&#8220;, new HashMap&lt;String,Object&gt;() {{ <\/p>\n<p>put( &#8222;street&#8220;, &#8222;Feenallee 1&#8220; ); <\/p>\n<p>put( &#8222;city&#8220;, &#8222;Elefenberg&#8220; ); <\/p>\n<p>}} ); <\/p>\n<p>}}; <\/p>\n<h6><\/h6>\n<\/p>\n<p>Warnung <\/p>\n<p>Die Doppelklammerinitialisierung ist nicht ganz \u201ebillig\u201c, da eine Unterklasse aufgebaut wird, also neuer Bytecode generiert wird. Zudem h\u00e4lt die innere Klasse eine Referenz auf die \u00e4u\u00dfere Klasse fest. Des Weiteren kann es Probleme mit equals(\u2026) geben, da wir mit der Doppelklammerinitialisierung eine Unterklasse schaffen, die vielleicht mit equals(\u2026) nicht mehr g\u00fcltig vergleichen werden kann, denn die Class-Objekte sind jetzt nicht mehr identisch. Das spricht in der Summe eher gegen diese Konstruktion.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Da anonyme Klassen keinen Namen haben, muss f\u00fcr Konstruktoren ein anderer Weg gefunden werden. Hier helfen Exemplarinitialisierungsbl\u00f6cke, also Bl\u00f6cke in geschweiften Klammern. Exemplarinitialisierer gibt es ja eigentlich gar nicht im Bytecode, sondern der Compiler setzt den Programmcode automatisch in jeden Konstruktor. Obwohl anonyme Klassen keinen direkten Konstruktor haben k\u00f6nnen, gelangt doch \u00fcber den Exemplarinitialisierer Programmcode [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-2953","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2953"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2953\/revisions"}],"predecessor-version":[{"id":2954,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2953\/revisions\/2954"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}