1

回答の 1 つで以下の例を見つけました: Java 内部クラスと静的なネストされたクラス

   public class Container {
        public class Item{
            Object data;
            public Container getContainer(){
                    return Container.this;
            }
            public Item(Object data) {
                    super();
                    this.data = data;
            }

        }

        public static Item create(Object data){
            // does not compile since no instance of Container is available
            return new Item(data);
        }
        public Item createSubItem(Object data){
            // compiles, since 'this' Container is available
            return new Item(data);
        }
    }

なぜこのようなことをするのか知りたいです:つまり、コンテナのインスタンスを取得するには、なぜ内部クラスのインスタンスを作成するのですか? このアプローチの用途は何ですか?どのデザインパターンですか?上記のアプローチは、メンテナンス プロジェクトの 1 つで既に使用されています。

4

3 に答える 3

3

この構造の主な目的は、 の管理ですdata。内部クラスが「コンテナ」への参照を配布することは、重要ではない実装の詳細です。

あなたのような抽象的で要約された例の問題は、「方法」をコードのライターからリーダーに転送するだけです。しかし、「なぜ」は完全に失われています。

したがって、ファイルの内部状態をContainerFileSystemItem置き換えるだけです。次に、次のことがわかります。Filedata

  • ファイルシステムには、1 つ以上のファイルを含めることができます。
  • ファイルは正確に 1 つのファイルシステムにあります。
  • ファイルの存続期間は、ファイルシステムの存続期間を超えることはできません。
  • Fileとの間の実装Filesystemは密接に結合されています。それぞれが他のprivateメソッドを呼び出す可能性があります。

最後のポイントは、IMO で最も重要なことです。スリムで安全なpublicAPI を実際のユーザーに提供しながらFile、お互いにFilesystem危険なメソッドを使用することができます。ファイルシステムの場合、これらの危険なメソッドへのアクセスを他の人privateに許可したくありません。

これらの特性は、いくつかの問題に共通しているため、使用されます。

于 2012-09-15T12:57:44.130 に答える
1

なぜこのようなことをするのか知りたいのです。つまり、コンテナのインスタンスを取得するために、なぜ内部クラスのインスタンスを作成するのでしょうか。

それは起こっていることではありません。

実際、メソッド を呼び出すことができる外部クラスのインスタンスがすでに存在しない限り、内部クラスのインスタンスを作成することはできません。内部クラスインスタンスを作成しても、外部クラスの新しいインスタンスは作成されません。むしろ、既存のインスタンスのコンテキストで作成します...内部クラスコンストラクターを呼び出すときに「使用可能」になるインスタンスです。Item ContainercreateSubItem

于 2012-09-15T12:50:37.967 に答える
0

static問題のメソッドは、クラスの静的メンバーのみにアクセスできるように定義されており、Itemクラスは静的内部クラスとして宣言されていないため、静的関数からはアクセスできません。

この特定の設計パターンやそれが必要な理由についてはわかりませんが、これはうまくいく可能性があります:

public static Item create(Object data) {
    Container c = new Container();
    return c.new Item(data);
}

このような設計を使用した場所の 1 つは、追加Comparatorのクラスを作成するためだけです。

于 2012-09-15T12:40:24.260 に答える