Die erste Option ermöglicht es Ihnen, eine
private final List<String> myList = new ArrayList<>();
So tun Sie verhindern, dass versehentlich später eine völlig neue Liste zu schaffen; Dies hilft bei (vielen, nicht allen) Multi-Threading-Problemen. Zusätzlich dazu kann der Compiler Ihnen jetzt helfen, sicherzustellen, dass Ihr Feld genau einmal initialisiert wird.
Darüber hinaus kann die zweite Option als "faul Initialisierung" angesehen werden. Und in diesem Sinne: Es kann als "Optimierungswahl" gesehen werden! Und von da an: Viele Menschen setzen sich dafür ein, eine vorzeitige Optimierung zu vermeiden!
Sie wissen, wenn Sie sich nicht darauf verlassen können, dass die Liste bereits erstellt wurde, kann das zu großen Problemen führen. Auch wenn Sie aus dieser Perspektive kommen, haben Sie ein anderes Argument, um Option 1 zu bevorzugen!
Bearbeiten, in Bezug auf die Compiler-Option: von einem Semantikpunkt sind Option 1 und 3 (mehr oder weniger) "gleich" [Hinweis: Wenn Sie feststellen, dass es einen Unterschied in Ihrem Code macht, wenn Sie Option1 oder Option3 wählen. .. das wäre ein guter Hinweis darauf, dass du in deinem Code etwas schrecklich falsch machst).
Dennoch ist die eine Sache, die einen Unterschied machen kann - wenn Sie eine „Dependency Injection“ Konstruktor haben, wie:
public YourClass() { this(new ArrayList<String>); }
YourClass(List<String> incomingList) { myList = incomingList; }
Diese Lösung Sinn für diese Art von Objekten macht, die Sie „Kontrolle“ müssen ; im Sinne von: Sie müssen Mocks an Ihre Klasse weitergeben, um Komponententests zu ermöglichen.
Lange Rede kurzer Sinn:
- option1 Bevorzugen, wenn möglich: final
- Verwendung option3 verwenden, wenn Dependency Injection erforderlich ist
- Vermeiden option2, wenn Sie wirklich gute Gründe, es zu gehen
Der erste. Lazy-Initialisierung wird massiv überbewertet und Thread-Sicherheitsprobleme sind viel wahrscheinlicher. –
@ cricket_007 Ich habe meine Frage für die Konstruktoroption bearbeitet – JavaDev