<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Singleton Smells</title>
	<atom:link href="http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/</link>
	<description>Ordina J-Technologies - Java Blog</description>
	<lastBuildDate>Fri, 30 Jul 2010 13:00:28 +0200</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Roy van Rijn</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/comment-page-1/#comment-195</link>
		<dc:creator>Roy van Rijn</dc:creator>
		<pubDate>Tue, 28 Apr 2009 11:53:20 +0000</pubDate>
		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=370#comment-195</guid>
		<description>Trouwens, je kan met Constructor Injection en het keyword final erg veel afdwingen met bijvoorbeeld je IoC framework. Als je in zo&#039;n klasse zit weet je zeker dat:

- Degene die deze klasse heeft aangemaakt heeft ook de dependency gezet
- De dependency kan nooit meer gewijzigd worden

Bijvoorbeeld:

public class PersoonService {

    //Compiler dwingt dat deze gevuld moet worden door een constructor
    final PersoonDao persoonDao;

    public PersoonService(final PersoonDao persoonDao) {
        this.persoonDao = persoonDao; //Kan nooit meer gemuteerd worden!
    }
}

Je kan dan zelfs een eigen (hardcoded) booster schrijven die de dependencies eenmalig zet, de instanties zijn dan misschien wel geen singletons, maar de dependencies zijn wel final en gezet.

Bijvoorbeeld:

public class Booster {
    public void onStartup() {
        //Wire everything
        PersoonDao persoonDao = new PersoonDao(myJDBCConnectie);
        PersoonService persoonService = new PersoonService(persoonDao);
        PersoonBean bean = new PersoonBean(persoonService);

        //etc etc :P misschien met factory erbij
    }
}

Yay, weer een eigen IoC framework geschreven, nog even een annotation-processor toevoegen, klaar ;-)</description>
		<content:encoded><![CDATA[<p>Trouwens, je kan met Constructor Injection en het keyword final erg veel afdwingen met bijvoorbeeld je IoC framework. Als je in zo&#8217;n klasse zit weet je zeker dat:</p>
<p>- Degene die deze klasse heeft aangemaakt heeft ook de dependency gezet<br />
- De dependency kan nooit meer gewijzigd worden</p>
<p>Bijvoorbeeld:</p>
<p>public class PersoonService {</p>
<p>    //Compiler dwingt dat deze gevuld moet worden door een constructor<br />
    final PersoonDao persoonDao;</p>
<p>    public PersoonService(final PersoonDao persoonDao) {<br />
        this.persoonDao = persoonDao; //Kan nooit meer gemuteerd worden!<br />
    }<br />
}</p>
<p>Je kan dan zelfs een eigen (hardcoded) booster schrijven die de dependencies eenmalig zet, de instanties zijn dan misschien wel geen singletons, maar de dependencies zijn wel final en gezet.</p>
<p>Bijvoorbeeld:</p>
<p>public class Booster {<br />
    public void onStartup() {<br />
        //Wire everything<br />
        PersoonDao persoonDao = new PersoonDao(myJDBCConnectie);<br />
        PersoonService persoonService = new PersoonService(persoonDao);<br />
        PersoonBean bean = new PersoonBean(persoonService);</p>
<p>        //etc etc <img src='http://blog.smart-java.nl/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  misschien met factory erbij<br />
    }<br />
}</p>
<p>Yay, weer een eigen IoC framework geschreven, nog even een annotation-processor toevoegen, klaar <img src='http://blog.smart-java.nl/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Roy van Rijn</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/comment-page-1/#comment-194</link>
		<dc:creator>Roy van Rijn</dc:creator>
		<pubDate>Mon, 27 Apr 2009 18:11:57 +0000</pubDate>
		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=370#comment-194</guid>
		<description>Het grote voordeel van het gebruik van IoC frameworks ten opzichte van zelfgemaakte Singletons lijkt me meer op het gebied van toegang. Je moet erg vreemde dingen doen in een goed framework om dingen op de verkeerde manier te doen. Natuurlijk kan je ook in bijvoorbeeld Spring dingen doen die niet goed zijn, maar als je een normale gebruiker een handleiding geeft zal het meestal wel goed gaan. Het framework zelf duwt je namelijk de juiste kant op.

Zeker met Dependency Injection is dit het geval, want in de klasse die gebruik maakt van een dependency heb je alleen een constructor of setter, meer doe je daar niet.

Tevens denk ik dat je heel snel problemen krijgt als je op verschillende projecten zelfgemaakte oplossingen tegenkomt, het is naar mijn mening voor de meeste programmeurs erg goed om een vaste manier te hebben van werken.. en tegenwoordig lijkt Spring de defacto te zijn.

Er zitten natuurlijk altijd &#039;nadelen&#039; aan het gebruik van een IoC framework, maarja... waar praten we dan over, deze dingen hoor je veel:

Guice (en Spring tegenwoordig): Je hebt annotations van je IoC framework in je code staan, dus zelf een dependency op het IoC framework. Je gecompileerde code heeft dus altijd het IoC framework nodig om te kunnen draaien. (Ja en? waarschijnlijk ook nog wel 10 andere frameworks)

Spring: De XML heeft een relatie met de Java-code, dus het hernoemen van een klasse kan ervoor zorgen dat het run-time niet meer werkt als je vergeet goed de XML-verwijzingen te veranderen. Maar een beetje IDE kan dit ook voor je oplossen natuurlijk.

Persoonlijk zou ik graag een keer een groot project met Guice willen doen, de echte &quot;Java manier&quot; met annotations. Want naast de snelheid (volgens sommige blogs 10x zo snel als Spring) heeft het nog een ander voordeel, de annotations zijn ook zelf-documenterend en makkelijker de refactoren.

@JKVA: Ja, deze post is compleet off-topic, maar ik vind het zelf schrijven van Singletons in de huidige enterprise wereld overboden en zonde van de tijd :)</description>
		<content:encoded><![CDATA[<p>Het grote voordeel van het gebruik van IoC frameworks ten opzichte van zelfgemaakte Singletons lijkt me meer op het gebied van toegang. Je moet erg vreemde dingen doen in een goed framework om dingen op de verkeerde manier te doen. Natuurlijk kan je ook in bijvoorbeeld Spring dingen doen die niet goed zijn, maar als je een normale gebruiker een handleiding geeft zal het meestal wel goed gaan. Het framework zelf duwt je namelijk de juiste kant op.</p>
<p>Zeker met Dependency Injection is dit het geval, want in de klasse die gebruik maakt van een dependency heb je alleen een constructor of setter, meer doe je daar niet.</p>
<p>Tevens denk ik dat je heel snel problemen krijgt als je op verschillende projecten zelfgemaakte oplossingen tegenkomt, het is naar mijn mening voor de meeste programmeurs erg goed om een vaste manier te hebben van werken.. en tegenwoordig lijkt Spring de defacto te zijn.</p>
<p>Er zitten natuurlijk altijd &#8216;nadelen&#8217; aan het gebruik van een IoC framework, maarja&#8230; waar praten we dan over, deze dingen hoor je veel:</p>
<p>Guice (en Spring tegenwoordig): Je hebt annotations van je IoC framework in je code staan, dus zelf een dependency op het IoC framework. Je gecompileerde code heeft dus altijd het IoC framework nodig om te kunnen draaien. (Ja en? waarschijnlijk ook nog wel 10 andere frameworks)</p>
<p>Spring: De XML heeft een relatie met de Java-code, dus het hernoemen van een klasse kan ervoor zorgen dat het run-time niet meer werkt als je vergeet goed de XML-verwijzingen te veranderen. Maar een beetje IDE kan dit ook voor je oplossen natuurlijk.</p>
<p>Persoonlijk zou ik graag een keer een groot project met Guice willen doen, de echte &#8220;Java manier&#8221; met annotations. Want naast de snelheid (volgens sommige blogs 10x zo snel als Spring) heeft het nog een ander voordeel, de annotations zijn ook zelf-documenterend en makkelijker de refactoren.</p>
<p>@JKVA: Ja, deze post is compleet off-topic, maar ik vind het zelf schrijven van Singletons in de huidige enterprise wereld overboden en zonde van de tijd <img src='http://blog.smart-java.nl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jan-Kees van Andel</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/comment-page-1/#comment-193</link>
		<dc:creator>Jan-Kees van Andel</dc:creator>
		<pubDate>Sun, 26 Apr 2009 13:48:06 +0000</pubDate>
		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=370#comment-193</guid>
		<description>&quot;De enige echte fout die je nog kunt maken is dat je vergeet een implementatie te koppelen aan een implementatie en daar kom je dan pas run-time achter.&quot;
Dat is dus precies hetzelfde als mijn 3 regeltjes reflection code. De enige fout die je kunt maken is dat je iets verandert aan de GoodSingleton constructor signature.

&quot;Kom ik terug op mijn vraag: waarom is IoC eigenlijk altijd run-time?&quot;
Stel dat je 2 implementaties hebt, 1 mock en 1 echte. De mock implementatie heeft de default constructor en de productie implementatie bevat een constructor met parameters, maar zonder @Inject. Dat gaat tijdens het draaien van de test goed en kan toch op de server fout gaan. Hence, runtime controle. Is dat erg? Ik denk van niet, net zoals dat het niet zo erg is dat mijn Singleton pas @runtime zal crashen bij een fout.

In een Guice app vinden wel meer checks @runtime plaats. Je kunt dus een access modifier verkeerd zetten (class/constructor/setter). Je kunt @Inject vergeten op een constructor of een empty constructor vergeten. Je kunt de bind() vergeten. Je kunt vergeten een implementatie te schrijven... Allemaal fouten die je kunt maken die de compiler niet detecteert. Het zijn deels theoretische gevallen, dat snap ik ook wel, maar in mijn optiek zijn bij mijn reflection Singleton de nadelen ook voornamelijk theoretisch.

Ik zie qua type safety dus vrij weinig verschillen tussen Guice en de Singleton. De Reflection API is generic en in dit geval type safe. Het enige waar je voor op moet letten qua type safety is dat je de signature van de GoodSingleton constructor niet moet veranderen, maar met 1 unit test (op getInstance) vang je zulke problemen waterdicht af. Thread safety is gemakkelijk aan te tonen (het zijn immers maar 2 kleine klassen) op basis van code analyse, terwijl je bij een framework maar moet hopen dat alles bugvrij is. Je haalt immers een enorme codebase binnen (snelle scan met Winrar levert in Guice 470 classes op).

Maar goed, het blijft een afweging, dus: Heb je geen IoC container? Wil je wel een Singleton? Moet je Singleton concurrent zijn (lijkt me een no-brainer)? Staat je SecurityManager setAccessible() toe? Wil je je Singleton unit testen (lijkt me ook een no-brainer)? Ben je bereid om een heel klein beetje type safety op te geven ten behoeve van testbaarheid? Wil je je code kunnen analyseren en niet meer dan 2 classes lezen?
Als je al deze vragen met JA kunt beantwoorden, dan is dit volgens mij een prima oplossing. Anders moet je waarschijnlijk tussen een standaard Singleton of IoC kiezen. Of geen Singleton gebruiken, want in veel gevallen heb je hem niet nodig.

Ps. Ik ben benieuwd of er voor Guice al APT Processors en Eclipse builders zijn. Lijken me nuttige tools. Dan kunnen ze @compile-time alle classes inspecteren op basis van de relaties tussen de classes/annotations en onderlinge consistentie controleren. @ImplementedBy is bijvoorbeeld erg eenvoudig te checken met APT, maar het is onmogelijk met standaard javac.

@Pieter: Idd. Bij reloaden van die applicaties wordt het nog vervelender, zeker als de client applicaties de referenties bewaren i.p.v. opvragen met getInstance(). Krijg je allemaal erg obscure bugs van (NullPointers, inconsistente data...).</description>
		<content:encoded><![CDATA[<p>&#8220;De enige echte fout die je nog kunt maken is dat je vergeet een implementatie te koppelen aan een implementatie en daar kom je dan pas run-time achter.&#8221;<br />
Dat is dus precies hetzelfde als mijn 3 regeltjes reflection code. De enige fout die je kunt maken is dat je iets verandert aan de GoodSingleton constructor signature.</p>
<p>&#8220;Kom ik terug op mijn vraag: waarom is IoC eigenlijk altijd run-time?&#8221;<br />
Stel dat je 2 implementaties hebt, 1 mock en 1 echte. De mock implementatie heeft de default constructor en de productie implementatie bevat een constructor met parameters, maar zonder @Inject. Dat gaat tijdens het draaien van de test goed en kan toch op de server fout gaan. Hence, runtime controle. Is dat erg? Ik denk van niet, net zoals dat het niet zo erg is dat mijn Singleton pas @runtime zal crashen bij een fout.</p>
<p>In een Guice app vinden wel meer checks @runtime plaats. Je kunt dus een access modifier verkeerd zetten (class/constructor/setter). Je kunt @Inject vergeten op een constructor of een empty constructor vergeten. Je kunt de bind() vergeten. Je kunt vergeten een implementatie te schrijven&#8230; Allemaal fouten die je kunt maken die de compiler niet detecteert. Het zijn deels theoretische gevallen, dat snap ik ook wel, maar in mijn optiek zijn bij mijn reflection Singleton de nadelen ook voornamelijk theoretisch.</p>
<p>Ik zie qua type safety dus vrij weinig verschillen tussen Guice en de Singleton. De Reflection API is generic en in dit geval type safe. Het enige waar je voor op moet letten qua type safety is dat je de signature van de GoodSingleton constructor niet moet veranderen, maar met 1 unit test (op getInstance) vang je zulke problemen waterdicht af. Thread safety is gemakkelijk aan te tonen (het zijn immers maar 2 kleine klassen) op basis van code analyse, terwijl je bij een framework maar moet hopen dat alles bugvrij is. Je haalt immers een enorme codebase binnen (snelle scan met Winrar levert in Guice 470 classes op).</p>
<p>Maar goed, het blijft een afweging, dus: Heb je geen IoC container? Wil je wel een Singleton? Moet je Singleton concurrent zijn (lijkt me een no-brainer)? Staat je SecurityManager setAccessible() toe? Wil je je Singleton unit testen (lijkt me ook een no-brainer)? Ben je bereid om een heel klein beetje type safety op te geven ten behoeve van testbaarheid? Wil je je code kunnen analyseren en niet meer dan 2 classes lezen?<br />
Als je al deze vragen met JA kunt beantwoorden, dan is dit volgens mij een prima oplossing. Anders moet je waarschijnlijk tussen een standaard Singleton of IoC kiezen. Of geen Singleton gebruiken, want in veel gevallen heb je hem niet nodig.</p>
<p>Ps. Ik ben benieuwd of er voor Guice al APT Processors en Eclipse builders zijn. Lijken me nuttige tools. Dan kunnen ze @compile-time alle classes inspecteren op basis van de relaties tussen de classes/annotations en onderlinge consistentie controleren. @ImplementedBy is bijvoorbeeld erg eenvoudig te checken met APT, maar het is onmogelijk met standaard javac.</p>
<p>@Pieter: Idd. Bij reloaden van die applicaties wordt het nog vervelender, zeker als de client applicaties de referenties bewaren i.p.v. opvragen met getInstance(). Krijg je allemaal erg obscure bugs van (NullPointers, inconsistente data&#8230;).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vincent</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/comment-page-1/#comment-192</link>
		<dc:creator>Vincent</dc:creator>
		<pubDate>Sun, 26 Apr 2009 10:21:37 +0000</pubDate>
		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=370#comment-192</guid>
		<description>Laten we het maar op ruis op de lijn houden ja :-)

Wat ik vooral bedoelde is dat bijna alle (Enterprise?) projecten een IoC container gebruiken. En als je die al gebruikt, waarom zou je dan nog met reflectie gaan goochelen? Immers, alle IoC containers zullen onder water ook reflectie gebruiken om hun doel te bereiken. Het zit er al in. En goed getest ook. Dus waarom zelf opnieuw implementeren? Dat wil dus niet zeggen dat ik een fan van IoC ben!

Als je echter nog geen IoC container gebruikt, dan vind ik het een ander verhaal.

IoC is natuurlijk ook run-time (waarom eigenlijk?), maar bijvoorbeeld met Google Guice kun je de bindings van interfaces aan implementatie wel gewoon compile-time en type-safe definiëren in een Module. Het lukt je niet een implementatie te koppelen aan een interface die de concrete klasse niet implementeert. Dat compileert gewoon niet. De enige echte fout die je nog kunt maken is dat je vergeet een implementatie te koppelen aan een implementatie en daar kom je dan pas run-time achter. (Ook al heb je een simpele integratietest die niks anders doet dan je Module in de lucht hijsen, dan nog is het te laat.)

Kom ik terug op mijn vraag: waarom is IoC eigenlijk altijd run-time?</description>
		<content:encoded><![CDATA[<p>Laten we het maar op ruis op de lijn houden ja <img src='http://blog.smart-java.nl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Wat ik vooral bedoelde is dat bijna alle (Enterprise?) projecten een IoC container gebruiken. En als je die al gebruikt, waarom zou je dan nog met reflectie gaan goochelen? Immers, alle IoC containers zullen onder water ook reflectie gebruiken om hun doel te bereiken. Het zit er al in. En goed getest ook. Dus waarom zelf opnieuw implementeren? Dat wil dus niet zeggen dat ik een fan van IoC ben!</p>
<p>Als je echter nog geen IoC container gebruikt, dan vind ik het een ander verhaal.</p>
<p>IoC is natuurlijk ook run-time (waarom eigenlijk?), maar bijvoorbeeld met Google Guice kun je de bindings van interfaces aan implementatie wel gewoon compile-time en type-safe definiëren in een Module. Het lukt je niet een implementatie te koppelen aan een interface die de concrete klasse niet implementeert. Dat compileert gewoon niet. De enige echte fout die je nog kunt maken is dat je vergeet een implementatie te koppelen aan een implementatie en daar kom je dan pas run-time achter. (Ook al heb je een simpele integratietest die niks anders doet dan je Module in de lucht hijsen, dan nog is het te laat.)</p>
<p>Kom ik terug op mijn vraag: waarom is IoC eigenlijk altijd run-time?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: gerlo</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/comment-page-1/#comment-191</link>
		<dc:creator>gerlo</dc:creator>
		<pubDate>Fri, 24 Apr 2009 13:07:02 +0000</pubDate>
		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=370#comment-191</guid>
		<description>Laten we teruggaan naar het oospronkelijk &#039;probleem&#039;. Ik snap namelijk het &#039;niet tesbaar zijn&#039; van de deze singleton niet goed. Dat ligt volgens mij meer aan het feit dat 
deze singleton op geen enkele manier benaderbaar is dan aan het feit dat het een singleton is. Een buitenstaander heeft dus ook niks aan deze singleton. Er zal op zijn minst een getter of een andere accessor methode moeten zijn om er iets mee te kunne. Als je simpelweg een getter toevoegt, kun je de BadSingletonClass prima testen : 

public class BadSingletonTest {
	
	@Before
	public void setup() {
		  System.setProperty(&quot;prop1&quot;, &quot;test value1&quot;);
	      System.setProperty(&quot;prop2&quot;, &quot;test value2&quot;);

	}
	
	@Test
    public void testSingleton() throws Exception {
        
       BadSingleton obj1 = BadSingleton.getInstance();
       BadSingleton obj2 = BadSingleton.getInstance();
        
       Assert.assertTrue(&quot;not same object&quot; ,obj1==obj2);
    }
	
	@Test
    public void testProperty() throws Exception {
        
       BadSingleton obj = BadSingleton.getInstance();
        
       Assert.assertEquals(obj.getProp1(), &quot;test value1&quot;);
       Assert.assertEquals(obj.getProp2(), &quot;test value2&quot;);
    }
}</description>
		<content:encoded><![CDATA[<p>Laten we teruggaan naar het oospronkelijk &#8216;probleem&#8217;. Ik snap namelijk het &#8216;niet tesbaar zijn&#8217; van de deze singleton niet goed. Dat ligt volgens mij meer aan het feit dat<br />
deze singleton op geen enkele manier benaderbaar is dan aan het feit dat het een singleton is. Een buitenstaander heeft dus ook niks aan deze singleton. Er zal op zijn minst een getter of een andere accessor methode moeten zijn om er iets mee te kunne. Als je simpelweg een getter toevoegt, kun je de BadSingletonClass prima testen : </p>
<p>public class BadSingletonTest {</p>
<p>	@Before<br />
	public void setup() {<br />
		  System.setProperty(&#8220;prop1&#8243;, &#8220;test value1&#8243;);<br />
	      System.setProperty(&#8220;prop2&#8243;, &#8220;test value2&#8243;);</p>
<p>	}</p>
<p>	@Test<br />
    public void testSingleton() throws Exception {</p>
<p>       BadSingleton obj1 = BadSingleton.getInstance();<br />
       BadSingleton obj2 = BadSingleton.getInstance();</p>
<p>       Assert.assertTrue(&#8220;not same object&#8221; ,obj1==obj2);<br />
    }</p>
<p>	@Test<br />
    public void testProperty() throws Exception {</p>
<p>       BadSingleton obj = BadSingleton.getInstance();</p>
<p>       Assert.assertEquals(obj.getProp1(), &#8220;test value1&#8243;);<br />
       Assert.assertEquals(obj.getProp2(), &#8220;test value2&#8243;);<br />
    }<br />
}</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jan-Kees van Andel</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/comment-page-1/#comment-190</link>
		<dc:creator>Jan-Kees van Andel</dc:creator>
		<pubDate>Fri, 24 Apr 2009 10:24:40 +0000</pubDate>
		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=370#comment-190</guid>
		<description>Ik meende juist op een bekrompen opmerking te reageren, maar goed, om een welles nietes discussie te voorkomen, hierbij een iets genuanceerder antwoord.

Mijn punt is dat Singletons bepaalde nadelen hebben, zoals testbaarheid. Ik draag daar een oplossing voor aan. Die oplossing heeft voor- en nadelen, zoals ook aangegeven in het stukje. Eén van die nadelen is inderdaad dat reflection meer bug gevoelig is dan alles wat je @compile-time kunt checken. Onderaan het stukje noem ik ook een alternatief (zie 2de bullet) dat geen reflection gebruikt.

De reden dat ik het stukje plaatste, is dat ik in de praktijk wel degelijk ontestbare Singletons tegenkom. Voor die gevallen is dit een relatief nette oplossing, maar het blijft een middel. Een middel met voor- en nadelen.

IoC is leuk, maar niet @compile-time (dat geldt niet alleen voor Spring). Dat is aan de ene kant een sterk punt van IoC, maar je verliest er een stukje veiligheid mee. Vandaar dat ik jouw opmerking over IoC zo vreemd vond. 3 regels reflection op een gecontroleerde plaats vind je slecht, maar een dependency @runtime opzoeken en injecteren vind je wel goed? Dat vind ik appels met peren vergelijken. En zeg nou zelf, hoeveel type safety raak je nou feitelijk kwijt? Zeker aangezien vrijwel alles in de reflection API generic is.

Maar goed, laten we het maar op &quot;ruis op de lijn&quot; houden. Volgens mij zijn we het er allebei over eens dat IoC in bepaalde gevallen nuttig is, reflection in bepaalde gevallen nuttig is en singletons in bepaalde gevallen nuttig zijn. Welk geval, daar heb ik in dit blog niets over gezegd, want dat is context afhankelijk.

Zijn we het nu eens? ;-)</description>
		<content:encoded><![CDATA[<p>Ik meende juist op een bekrompen opmerking te reageren, maar goed, om een welles nietes discussie te voorkomen, hierbij een iets genuanceerder antwoord.</p>
<p>Mijn punt is dat Singletons bepaalde nadelen hebben, zoals testbaarheid. Ik draag daar een oplossing voor aan. Die oplossing heeft voor- en nadelen, zoals ook aangegeven in het stukje. Eén van die nadelen is inderdaad dat reflection meer bug gevoelig is dan alles wat je @compile-time kunt checken. Onderaan het stukje noem ik ook een alternatief (zie 2de bullet) dat geen reflection gebruikt.</p>
<p>De reden dat ik het stukje plaatste, is dat ik in de praktijk wel degelijk ontestbare Singletons tegenkom. Voor die gevallen is dit een relatief nette oplossing, maar het blijft een middel. Een middel met voor- en nadelen.</p>
<p>IoC is leuk, maar niet @compile-time (dat geldt niet alleen voor Spring). Dat is aan de ene kant een sterk punt van IoC, maar je verliest er een stukje veiligheid mee. Vandaar dat ik jouw opmerking over IoC zo vreemd vond. 3 regels reflection op een gecontroleerde plaats vind je slecht, maar een dependency @runtime opzoeken en injecteren vind je wel goed? Dat vind ik appels met peren vergelijken. En zeg nou zelf, hoeveel type safety raak je nou feitelijk kwijt? Zeker aangezien vrijwel alles in de reflection API generic is.</p>
<p>Maar goed, laten we het maar op &#8220;ruis op de lijn&#8221; houden. Volgens mij zijn we het er allebei over eens dat IoC in bepaalde gevallen nuttig is, reflection in bepaalde gevallen nuttig is en singletons in bepaalde gevallen nuttig zijn. Welk geval, daar heb ik in dit blog niets over gezegd, want dat is context afhankelijk.</p>
<p>Zijn we het nu eens? <img src='http://blog.smart-java.nl/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vincent</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/comment-page-1/#comment-189</link>
		<dc:creator>Vincent</dc:creator>
		<pubDate>Wed, 22 Apr 2009 20:39:58 +0000</pubDate>
		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=370#comment-189</guid>
		<description>Jan-Kees, die opmerking van je is te provocerend en te (waarschijnlijk met opzet) te bekrompen om serieus op te reageren. :-)

Appels en peren.

En ook nog eens niet waar, op meer dan 1 manier...

Oh ja, en Spring is niet het enige IOC framework.

;-)</description>
		<content:encoded><![CDATA[<p>Jan-Kees, die opmerking van je is te provocerend en te (waarschijnlijk met opzet) te bekrompen om serieus op te reageren. <img src='http://blog.smart-java.nl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Appels en peren.</p>
<p>En ook nog eens niet waar, op meer dan 1 manier&#8230;</p>
<p>Oh ja, en Spring is niet het enige IOC framework.</p>
<p> <img src='http://blog.smart-java.nl/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: PietervdM</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/comment-page-1/#comment-188</link>
		<dc:creator>PietervdM</dc:creator>
		<pubDate>Wed, 22 Apr 2009 13:33:34 +0000</pubDate>
		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=370#comment-188</guid>
		<description>Er is nog wel een nadeel van Singletons, Met de classloader is het mogelijk om meerdere instanties van je singleton te maken.

Worst case: Singleton instance per class loader. Zie ook issues met bijvoorbeeld Log4J en meerdere apps in een single JVM.</description>
		<content:encoded><![CDATA[<p>Er is nog wel een nadeel van Singletons, Met de classloader is het mogelijk om meerdere instanties van je singleton te maken.</p>
<p>Worst case: Singleton instance per class loader. Zie ook issues met bijvoorbeeld Log4J en meerdere apps in een single JVM.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jan-Kees van Andel</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/comment-page-1/#comment-187</link>
		<dc:creator>Jan-Kees van Andel</dc:creator>
		<pubDate>Wed, 22 Apr 2009 11:24:33 +0000</pubDate>
		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=370#comment-187</guid>
		<description>Je bent dus tegen reflection, maar een fan van IoC? IoC frameworks doen ook alles @runtime, waardoor je compile time checks kwijtraakt.</description>
		<content:encoded><![CDATA[<p>Je bent dus tegen reflection, maar een fan van IoC? IoC frameworks doen ook alles @runtime, waardoor je compile time checks kwijtraakt.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vincent</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/19/singleton-smells/comment-page-1/#comment-184</link>
		<dc:creator>Vincent</dc:creator>
		<pubDate>Mon, 20 Apr 2009 19:44:10 +0000</pubDate>
		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=370#comment-184</guid>
		<description>Heel simpel: ik maak ze niet.

Geen hond bouwt nog (enterprise) applicaties zonder gebruik te maken van een dependency injection framework. En die stellen je prima in staat om Singletons te definieren zonder dat je dat in de klasse vast moet leggen. Dus waarom zou je allerlei technische trucs gaan toepassen? Helemaal als die het je onmogelijk maken je code goed te unit testen?

Singleton is een Design Pattern. Een pattern waar op zich niks mis mee is. Met veel van de technische uitwerkingen ervan wel.</description>
		<content:encoded><![CDATA[<p>Heel simpel: ik maak ze niet.</p>
<p>Geen hond bouwt nog (enterprise) applicaties zonder gebruik te maken van een dependency injection framework. En die stellen je prima in staat om Singletons te definieren zonder dat je dat in de klasse vast moet leggen. Dus waarom zou je allerlei technische trucs gaan toepassen? Helemaal als die het je onmogelijk maken je code goed te unit testen?</p>
<p>Singleton is een Design Pattern. Een pattern waar op zich niks mis mee is. Met veel van de technische uitwerkingen ervan wel.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
