「Java Concurrency in Practice」から以下の点を理解する上でご協力いただければ幸いです。
コンストラクターからオーバーライド可能なインスタンス メソッド (private でも final でもないメソッド) を呼び出すと、this 参照がエスケープされる可能性もあります。
- ここでの「エスケープ」は、インスタンスが完全に構築される前に、インスタンス メソッドを呼び出す可能性があるということを単に意味しているのでしょうか?
「this」が他の方法でインスタンスのスコープからエスケープするとは思えません。 - 「final」はどのようにしてこれを防ぐのでしょうか?インスタンス作成における「final」の何か見逃している側面があるのでしょうか?
ベストアンサー1
これは、クラス外部のコードを呼び出して を渡すことを意味します
this
。
そのコードは、インスタンスが完全に初期化されていると想定し、そうでない場合は動作が中断する可能性があります。
同様に、クラスでは、一部のメソッドはインスタンスが完全に初期化された後にのみ呼び出されると想定している可能性がありますが、外部コードはその想定を破る可能性があります。final
メソッドはオーバーライドできないため、渡されないことを信頼できますthis
。非クラスのコンストラクタで
非メソッドを呼び出すと、派生クラスがそのメソッドをオーバーライドしてどこにでも渡す可能性があります。メソッドを呼び出す場合でも、メソッドが安全に記述されていることを確認する必要があります。つまり、メソッドがどこにも渡されず、メソッド自体が非メソッドを呼び出さないことを確認する必要があります。final
final
this
final
this
final