{"id":62,"date":"2008-06-05T14:57:37","date_gmt":"2008-06-05T14:57:37","guid":{"rendered":"http:\/\/byteblog.internetallee.de\/?p=62"},"modified":"2008-06-05T14:57:37","modified_gmt":"2008-06-05T14:57:37","slug":"immer-eins-nach-dem-anderen","status":"publish","type":"post","link":"https:\/\/blogs.internetallee.de\/byteblog\/2008\/06\/05\/immer-eins-nach-dem-anderen\/","title":{"rendered":"Immer eins nach dem anderen"},"content":{"rendered":"<p>Ein kleines Beispiel zeigt, wo die Reihenfolge der Deklaration von Variablen in Java Klassen wichtig ist.<\/p>\n<p>Auf der Tomcat Mailingliste kam heute eine Mail, in der jemand  fragte, warum sein Singleton im Tomcat nicht einamlig in der JVM  vorhanden war. Die L\u00f6sung war wohl, dass er zwei verschiedene  Classloader benutzte und daher zwei verschiedene Instanzen.<\/p>\n<p>Ein anderes Problem seines Codes war aber ganz anderer Natur. Der Code sah etwa so aus:<\/p>\n<pre class=\"brush: java;\">public class Singleton {\n\u00a0\u00a0\u00a0 private static Singleton instance = new Singleton();\n\u00a0\u00a0\u00a0 private static int counter = 0;\n\n\u00a0\u00a0\u00a0 private Singleton() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(\"Counter: \" + (++counter));\n\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0 public static getInstance() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return instance;\n\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0 public int getCounter() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return counter;\n\u00a0\u00a0\u00a0 }\n}<\/pre>\n<p>Auf den ersten Blick sieht das in Ordnung aus. Der Konstruktor gibt brav ein <code>\"Counter: 1\"<\/code> aus und man ahnt nichts b\u00f6ses. Bis dann ein kleiner Testfall mit <a href=\"http:\/\/www.junit.org\/\" target=\"_blank\">jUnit<\/a> aufkreuzt:<\/p>\n<pre class=\"brush: java;\">public class SingletonTest extends TestCase {\n\u00a0\u00a0\u00a0\u00a0 public void testSingletonCounter() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Singleton instance = Singleton.getInstance();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 assertEquals(instance.getCounter(), 1,\n              \"Es kann nur einen geben\");\n\u00a0\u00a0\u00a0\u00a0 }\n}<\/pre>\n<p>Hier wird dann pl\u00f6tzlich klar, dass intern der <code>counter<\/code> trotz anderweitiger Ausgabe wieder auf <code>0<\/code> gesetzt wurde. Das liegt daran, dass die Initialisierung der statischen  Klassenvariablen der Reihe nach geschieht. Im Konstruktor ist <code>counter<\/code> also erstmal nicht definiert &#8211; implizit also null &#8211; und wird dann auf  eins inkrementiert. Nach dem Konstruktor wird dann die vermeintlich noch  nicht initialsierte Variable auf <code>0<\/code> gesetzt.<\/p>\n<p>Das kann ganz sch\u00f6n ins Auge gehen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein kleines Beispiel zeigt, wo die Reihenfolge der Deklaration von Variablen in Java Klassen wichtig ist. Auf der Tomcat Mailingliste kam heute eine Mail, in der jemand fragte, warum sein Singleton im Tomcat nicht einamlig in der JVM vorhanden war. Die L\u00f6sung war wohl, dass er zwei verschiedene Classloader benutzte und daher zwei verschiedene Instanzen. [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[32,23,27],"class_list":["post-62","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-java","tag-servlet","tag-sprachen"],"_links":{"self":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts\/62","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/comments?post=62"}],"version-history":[{"count":0,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts\/62\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/media?parent=62"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/categories?post=62"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/tags?post=62"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}