1

以下はEffectiveJavaからのものです。

非静的メンバークラスインスタンスとそれを囲むインスタンスの間の関連付けは、前者が作成されたときに確立されます。それ以降は変更できません。通常、関連付けは、囲んでいるクラスのインスタンスメソッド内から非静的メンバークラスコンストラクターを呼び出すことによって自動的に確立されます。まれではありますが、式enclosingInstance.new MemberClass(args)を使用して手動で関連付けを確立することができます。ご想像のとおり、関連付けは非静的メンバークラスインスタンスのスペースを占有し、その構築に時間を追加します。

Blochがここで言っていることは、「まれですが、式enclosingInstance.new MemberClass(args)を使用して手動で関連付けを確立することは可能です。ご想像のとおり、関連付けは非静的メンバークラスインスタンスのスペースを占有し、その建設。」?

4

1 に答える 1

5

彼は、少なくとも2つの方法で接続を確立できることを意味します。与えられた

public class Outer {
    public class Inner {
    }
    void f() {System.out.println(new Inner());}
}
Outer x = new Outer();

あなたが電話する場合

x.f()

次に、出力する値はにリンクされた内部オブジェクトxです。

ただし、次を呼び出すこともできます。

x.new Inner();

同様にリンクされた新しい内部オブジェクトを作成しxます。

ブロッホは、2番目の方法はまれだと言っています。理由はわかりません。私は過去にそれを使用しました。

ライブデモを見る

class Outer {
    String name;
    public Outer(String name) {
        this.name = name;
    }

    public class Inner {
        public String toString() {
            return "I belong to " + Outer.this.name;
        }
    }

    void f() {
        System.out.println(new Inner());
    }

    void g(Outer a) { 
        System.out.println(a.new Inner());
    }
}

class Main {
    public static void main(String[] args) {
        Outer x = new Outer("x");
        Outer y = new Outer("y");
        x.f();
        x.g(y);      
    }
}

出力:

I belong to x
I belong to y
于 2012-07-19T08:24:47.657 に答える