ArrayList <>のようなオブジェクトの初期化と、フィールド宣言またはコンストラクターの要素との違いに疑問があるのですが。
メモリ使用量、パフォーマンスなどに違いはありますか、それともまったく同じですか?
オプション1:
class MyClass {
private List<String> strings = new ArrayList<String>();
}
オプション2:
class MyClass {
private List<String> strings;
public MyClass() {
strings = new ArrayList<String>();
}
}
ばかげた質問かもしれませんし、非常に基本的な質問かもしれませんが、私は最初から構築するのが好きです。
違いがあります:when初期化が発生します。フィールドが最初に初期化され、次にコンストラクターが起動します。
自明な例では、実際的な違いはありませんが、初期化のために別のフィールドがListフィールドに依存している場合、コンストラクターのバージョンはNPEで爆発します。
検討してください:
private List<String> strings = Arrays.asList("foo", "bar");
private String stringsDescription = strings.toString();
strings
の初期化をコンストラクターに移動した場合、stringsDescription
の初期化はNPEで爆発します。
それは本質的に同じことです。コンストラクターでそれを行うと、それをより詳細に制御できます(たとえば、コンストラクターが異なれば、実行できることも異なります)が、最終結果は同じです。
メモリ、CPU、またはその他の方法でパフォーマンスに違いはありません。
これを見てください デフォルトコンストラクターとインラインフィールドの初期化
値を初期化する他の方法もあります: https://docs.Oracle.com/javase/tutorial/Java/javaOO/initial.html
私見、デフォルトコンストラクターでの初期化は、それが唯一のコンストラクターであることが確実でない限り、少し危険です。複数ある場合は、常にデフォルトを呼び出すか(グッドプラクティス)、初期化コードを複製する必要があります。