Naja, zumindest keine Lazy-Init, und damit keine Multithreading Probleme…
Das wäre IMHO ein sehr gutes Beispiel für DI, u.a. deswegen:
Diese MapList muss von überall aus erreichbar sein, weil sie an verschiedensten Stellen, die nichts voneinander wissen, benötigt wird.
Die „gute“ alte gloable Variable…
Das hast du zwar ohne DI erreicht, aber auf kosten der Testbarkeit wegen der Kopplung.
Durch die statische Kopplung zur getInstance Methode müsstest du jetzt tricksen beim Mocken (statische felder mocken), da geht natürlich mittlerweile, ist aber aufwendiger als mit DI.
Dazu kommt, dass MapList jetzt nicht nur zugriff auf die einzelnen Maps bietet, sondern sich auch für die Erzeugung und den Zugriff auf die MapList selber verantwortlich ist, d.h. SoC (Seperation of Concerns).
Nebenbei, das mit dem JOptionPane finde ich nicht gut an dieser Stelle, Exception werfen und den äusseren Kontext diese behandeln lassen wäre ein Möglichkeit ,aber ich glaube hier reicht es einfach wenn nix gemacht wird und wieder der Aufrufer (= äuserer Kontext) auf die leeren MapList reagiert.
Damit hätte deine MapList auch keine Kopplung zu Swing
Kann den Tipp mit Guice nur wiederholen, wenn man sich mal mit dem Themen Design, Architektur, Testen etc. pp. auseinandergesetzt und DI verstanden hat, wird man nicht mehr ohne wollen, nicht ohne Grund.
Das Video ansehen reicht meist schon dass man versteht wo die Vorteile leigen.
Ach ja, hier ist was Erich Gamma selber zu Singletons sagt:
Es geht IMHO nicht darum, dass das Singleton als „das böseste Anti-Pattern“ der Welt ist, sondern darum, dass Leute die das nutzen einfach nur einen Hammer haben und die Alternativen ignorieren…
Ich finde da sollte man seinen Werkzeugkasten erweitern und mit den neuen Dingen üben.
Vor allem macht DI aber Spass und Tests schreiben wird einfacher
Wenn man dann DI und Tests draufhat, kann man sich mal an TDD wagen… aber dass kommt später