ここでの秘訣は、内部クラスがどのように機能するかを知ることです。これは本質的に単なる「通常の」静的クラスですが、そのコンストラクターは暗黙的に外側のクラスへの参照を取得します。したがって、この:
public class TopLevel {
public void go() {
new Inner().bar();
}
public void foo() { }
public class Inner {
public void bar() {
TopLevel.this.foo();
}
}
}
これと同等です:
public class TopLevel {
public void go() {
new Inner(this).bar(); // explicitly passing in "this"
}
public void foo() { }
public static class Inner {
private final TopLevel parent; // note that we have this new field
public Inner(TopLevel parent) { // note this new constructor
this.parent = parent;
}
public void bar() { // we use the explicit reference instead
parent.foo(); // of the implicit TopLevel.this
}
}
}
つまり、内部クラスをトップレベル クラスにリファクタリングする方法は、インスタンスを参照する明示的なフィールドを追加し、この参照をコンストラクターUpperClass
に渡すことです。NestedClass
つまり、最初のコード スニペットではなく、2 番目のコード スニペットのようになります。