ネストされたクラスの使用/例はどのような場合に使用すればよいですか?

StackOverflow https://stackoverflow.com/questions/1549485

  •  20-09-2019
  •  | 
  •  

質問

関連する言語を含めるためにこの質問を再タグ付けしてください

そのため、私の Java の本にはネストされたクラスに関する章全体が含まれていましたが、実際にネストされたクラスを使用するのは「構成関係をモデル化し、非表示にしたいクラスの内部を実装する」場合にのみ行うべきであるという注記で終わりました。それでは、ネストされたクラスを使用する必要がある場合といくつかの例について説明します。

役に立ちましたか?

解決

ネストされた内部クラスは、別のクラスのコンテキスト内でのみ使用されるクラスであり、独自のクラス ファイルを持ちません。インスタンスにリンクされている場合、親クラス インスタンスのコンテキスト内でのみインスタンス化できます。プライベート データ、または静的クラスの場合はプライベート静的データのみを表示できます。

Java 開発者サイトには、1 つの例を含むネストされたクラスのチュートリアルがあります。http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html

いくつかの使用例:

  • の具象実装を隠す インターフェイス:

(Hibernate のようなツールのデータベース セッションを考えてみましょう):Session インターフェイスと、Session のインスタンスを返す SessionFactory があるとします。Session インターフェイスを実装する SessionImpl 具象クラスは、それを構築および初期化する方法を知っているファクトリの内部クラスである可能性があります。

  • 情報の提供には、 インターフェイス:

Wicket Web フレームワークでは、各 GUI コンポーネントに関連付けられた「モデル」があり、その仕事はデータをコンポーネントに接続することです。インターフェイスは次のようになります。

public interface IModel extends IDetachable {
 public Object getObject();
 public Object setObject();
}

作成したカスタム GUI コンポーネントのデータを取得するための特別なロジックがあるとします。同じ方法でデータを取得するコンポーネントは他にないため、IModel が提供される時点で匿名クラスを使用してデータの取得を処理できます。同じクラス内に IModel 実装を再利用する必要がある別のポイントがある場合は、それを内部クラスにすることができます。後で、他の場所でモデルが必要になった場合は、それを最上位クラスに変換できます。

一般に、クラス定義が必要な状況では内部クラスを使用しますが、そのクラスは親クラスのコンテキストでしか使用できないか、意味を持ちません。

他のヒント

私がネストされたクラスを実際に使用したのは、グローバル設定オブジェクトでした。

親クラスはシングルトンで、設定カテゴリとしてネストされたクラスがありました。

  • 設定
    • ファイル設定
    • 印刷設定
    • 等。

設定クラスのスコープ外では内部オブジェクトを使用できないため、内部オブジェクトを別のクラスとして作成することに実質的な意味はありません。

通常、多くの引数を持つメソッドとして実行されるアルゴリズムをカプセル化するために、ネストされたクラスを使用します。私は生データを持つクラスを使用し、アルゴリズムをネストされたクラスの別のファイルに置きます(部分キーワードを使用)。そうすることで、そのアルゴリズムのプロパティを設定でき、その (動作中の) データはアルゴリズムが完了した後も存続します。ネストされたクラスを使用せずにそれを簡単に実行できることはわかっていますが、アルゴリズムは親クラス用に意図的に構築されているため、これは正しいと感じます。

   public partial class Network
    {
            partial void initFDLF()
            {
                fdlf=new FDLF(this);
            }

        public FDLF fdlf;
        public class FDLF
        {
            internal bool changed=true;
            internal bool pvchange=true;
            public double epsilon = 0.001;
            public bool fdlfOk=false;
            public void init(){...}
            public void run(){...}
            ...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top