エンクロージングクラスのインスタンスメソッドの呼び方

GLATTS勉強会ブログ» ブログアーカイブ » 「Effective Java 第2版」第5回(2月17日)の、p.30の「ファイナライザガーディアンのイデオム」で話題にあがった、

無名クラスとエンクロージングクラスで同じシグニチャのインスタンスメソッドの時、無名クラス内からエンクロージングクラスのそのメソッドはどうやって呼べばよいか?

についてです。

エンクロージングクラス名.this とすると、エンクロージングインスタンスのthisを得ることができます。The Java Language Specification, Third Edition15.8.4 Qualified this にありました。これを使えばエンクロージングクラスのインスタンスメソッドを呼ぶことができるはずです。

但し、p.30の「ファイナライザガーディアンのイデオム」の説明では、ページ中ほどに

ファイナライズを必要とするクラスにファイナライザを書く代わりに、エンクロージングインスタンスをファイナライズすることだけを目的にした無名クラスにファイナライザを書くことです。

とありますし、コード下にも、

publicのクラスであるFooは、(…)ファイナライザを持っていません。したがって、サブクラスのファイナライザがsuper.finalizeを呼ぶかどうかは、問題にはなりません。

とあるので、「ファイナライザガーディアンのイデオム」はFooにfinalize()は持たず、この無名クラスのfinalize()に本来Fooのfinalize()ですべきことを書きなさいということだと思います。(Fooにfinalize()を持って、無名クラスのfinalize()内で、Foo.this.finalize();をしろということではない。)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA