最初のオプションを使用すると、このように誤っ後に完全に新しいリストを作成してからあなたを防ぐ
private final List<String> myList = new ArrayList<>();
を行うことができます。マルチスレッドの問題を解決することができます。それに加えて、今コンパイラは、フィールドがのように、一度だけに初期化されていることを確認するのに役立ちます。
それを超えると、2番目のオプションは「遅延初期化」と見ることができます。そしてその意味では、それは「最適化の選択」と見ることができます!そこから:早期の最適化を避けることを擁護する多くの人々がいる!
あなたは既に作成されているリストに頼ることができないとき、それは多くの問題を引き起こす可能性があります。その視点から来ても、オプション1を好む別の議論があります!
コンパイラオプションに関する編集:セマンティクスポイントからオプション1と3は多かれ少なかれ同等です[ヒント:オプション1またはオプション3を選択した場合、コードに違いがあることがわかっている場合。 ..それはあなたのコードで何かがひどく間違っているという良い兆候になります)。それにもかかわらず
、違いを作ることができます一つのこと - あなたのような、「依存性注入」コンストラクタを持っている場合:
public YourClass() { this(new ArrayList<String>); }
YourClass(List<String> incomingList) { myList = incomingList; }
このソリューションは、あなたが「コントロール」する必要のあるオブジェクトのこれらの種類の意味があります;という意味で:ユニットテストを可能にするには、クラスにモックを渡す必要があります。
かいつまん:可能であれば
- は、オプション1を好む:最終
- 使用オプション3を使用して、あなたはそれのために行くには本当に十分な理由がない限り、依存性注入を
- 避けオプション2を必要とする場合
最初のもの。遅延初期化は大規模にオーバーレイされ、スレッドの安全性の問題が発生する可能性が非常に高くなります。 –
@ cricket_007私はコンストラクタオプションの質問を編集しました – JavaDev