直感的に言えば、Java のコンストラクターはオブジェクトを作成するものであり、コンストラクターが戻るまでそのオブジェクトには何も触れられないと思っていました。ただし、これについて何度も何度も間違っていることが証明されています。
- 初期化されていないオブジェクトは、共有によってリークされる可能性があります
this
- 初期化されていないオブジェクトは、ファイナライザーからアクセスするサブクラスによってリークされる可能性があります
- 初期化されていないオブジェクトは、完全に構築される前に別のスレッドにリークされる可能性があります
これらの事実はすべて、コンストラクターとは何かという私の直感に反しています。
コンストラクターが Java で実際に何をするのか、またはコンストラクターが何のために使用されることになっているのか、自信を持って言うことはできません。すべての final フィールドを持つ単純な DTO を作成している場合、コンストラクターの使用法を理解できます。これは、変更できないことを除いて、C の構造体とまったく同じであるためです。それ以外では、Java でどのコンストラクターを確実に使用できるのか見当がつきません。それらは単なるコンベンション/シンタックスシュガーですか? (つまり、オブジェクトを初期化するファクトリしかない場合はX x = new X()
、 のみを使用し、各フィールドを変更x
してデフォルト値以外の値を設定します。上記の 3 つの事実を考えると、これは実際の Java とほぼ同じです)
コンストラクターによって実際に保証されている 2 つのプロパティを挙げることができます。そうすると、それが のインスタンスであるが のサブクラスではないX x = new X()
ことがわかり、最終フィールドは完全に初期化されます。あなたは、 finishedのコンストラクターを知っていて、有効なオブジェクトを持っていると言いたくなるかもしれませんが、別のスレッドに渡す場合、これは真実ではありません。ファクトリの呼び出しの保証)。コンストラクターが実際に保証する他のプロパティは何ですか?x
X
X
X
X