実際、これは非常に良い質問です。たとえば、クラスの 2 つの異なるインスタンスがInnner
クラスの同じインスタンスを共有しているかどうかを確認できるようにする必要がある場合Outer
(コンテキストに応じて == または等しい)。
汎用インターフェイスを作成することをお勧めします(名前付き内部クラスには絶対に必要ではありませんが、「インスタンス化」/キャストできます):
public interface InnerClass<Outer> {
Outer getOuter();
}
これは、任意の名前付き内部クラスに適用できます。
次に、次のようなことを行います。
class MyInnerClass implements InnerClass<Outer> {
Outer getOuter() {
return Outer.this;
}
// remaining implementation details
}
このようにして、インターフェイスを実装する内部クラスから外部クラスにアクセスできInnerClass<Outer>
ます(実際に実装されていることを確認します)。
内部クラスが匿名の場合は、次のことしかできません (サンプルを提供してくれた Rich MacDonald に感謝します)。
new InterfaceOrAbstractClass<Outer>() {
Outer getOuter() { // super inefficient but this is the only way !
return (Outer)getClass().getDeclaredField("this$0");
}
/* other methods */
}
ただし、匿名クラス本体の外部にアクセスできるように実装するInterfaceOrAbstractClass
必要があります!InnerClass<Outer>
getOuter()
javac がすべての内部クラスにある種のInnerClass<Outer>
インターフェースを自動的に実装すると、非常に簡単になり、匿名クラスでも非常に効率的に実行できます (遅いイントロスペクション処理はありません)!