15 Februar 2015

Reading-Liste für Java — oder: worüber ich eigentlich noch bloggen will …

Michael Sharhag hat einen schönen zusammenfassenden Artikel über die Nutzung der Java 8 java.time API geschrieben. Den will ich euch nicht vorenthalten.

Qualifier sind bei Dependency Injection sehr wichtig. Daher ist auch der von Pivotal veröffentlichte Blogbeitrag sehr interessant.

Seit Java 7 gibt es das ServiceLoader-Interface. Eine sehr interessante Sache. Kann man eigentlich öfter verwenden, als man denkt …

14 Februar 2015

Dependency Injection – Konstruktor oder Property?

Dependency Injection hat sich durchgesetzt. Das muss also nicht mehr diskutiert werden. Es gibt zwar noch alte Projekte, die anders arbeiten (davon gibt es massig, denn auch in der Vergangenheit waren wir Programmierer ja nicht faul sondern haben Software geschrieben) – aber neuere Entwicklungen kommen selten ohne aus.

Leider gibt es noch oft Diskussionen, ob die DI via Property (also Setter-Methoden) oder den Konstruktor gehen soll. In den meisten Softwareprojekten sieht man ausschließlich Property-Injection (also einen Default-Konstruktor sowie ganz viele Setter). Dabei wird leider eine aus meiner Sicht grundlegende Regel vergessen: nach dem Konstruktor soll das Objekt minimal lauffähig sein. Dass heißt, dass alle verpflichtenden Informationen vorhanden sein müssen.

Oder anders ausgedrückt: in den seltensten Fällen ist ein Default-Konstrutor ausreichend für ein funktionierendes Objekt. Demnach spricht vieles für eine konstruktorbasierte DI.

Aber auch hier greift es zu kurz: der Konstruktor sollte ein minimal lauffähiges Objekt erzeugen. Und einige DI-Dependencies werden hier nicht benötigt. Diese Abhängigkeiten sollen also nicht in den Konstruktor. Und da spricht ja auch nichts dagegen: die absolut notwendigen Abhängigkeiten kommen in den Konstruktor, die optionalen Abhängigkeiten in Properties.

Oft wird angeführt, dass das weit verbreitete (und oft auch von mir genutzte) Spring-Framework keine Konstruktor-DI unterstützen würde oder die Entwickler von Konstruktor-DI abraten würden, aber wie der Blogeintrag http://spring.io/blog/2007/07/11/setter-injection-versus-constructor-injection-and-the-use-of-required/ schon 2007 beschrieb, sehen das unsere  Kollegen von Pivotal auch so wie hier beschrieben.

Voilà, das Problem ist sauber gelöst. Ohne Religionskrieg.