0

オブジェクトの初期化について基本的な質問があります。UPDATE SomeClass は単なる他のクラスです。someClass のメソッドを使用するだけのクラス Foo。例: DAO オブジェクト (SomeClass) のメソッドを使用するコントローラー (Foo)。

最善のアプローチは何ですか?

1 つのアプローチ - コンストラクターの使用

 public class Foo{

      private SomeClass someClass;

      public Foo()
      {
         someClass=new SomeClass();
      }
      public void method1(){//uses someClass}
      public void method2(){//uses someClass}
  }

2 アプローチ - すべてのメソッドでの初期化

      public class Foo{

       public void method1(){SomeClass someClass = new SomeClass();}
       public void method2(){SomeClass someClass = new SomeClass();}
  }

3 アプローチ - コンストラクターを使用しない初期化

       public class Foo{

        private SomeClass someClass=new SomeClass();

        public void method1(){//uses someClass}
        public void method2(){//uses someClass}
 }
4

2 に答える 2

2

あなたの質問への答えは、 SomeClass がどのように機能するか、および何をしたいかによって異なります。

アプローチ 1: コンストラクターでオブジェクト インスタンスを作成します。

  • 利点: 異なるコンストラクターで異なるインスタンスを作成できます。Foo のすべてのメソッドで同じインスタンスを使用できます。
  • 短所: Foo のすべてのメソッドで同じインスタンスを使用したくない場合があります。

アプローチ 2: メソッドでオブジェクト インスタンスを作成する。

  • 利点: 1 つのメソッドでさまざまな SomeClass インスタンスを使用できます。
  • 短所: SomeClass を複数回インスタンス化する必要があります。SomeClass の機能によっては、これはコストがかかる可能性があります。

アプローチ 3: 属性宣言でオブジェクト インスタンスを作成する。

  • 利点: どのコンストラクターが呼び出されても (値を上書きしない限り)、Foo のすべてのメソッドで同じインスタンスを取得します。

  • 短所: メソッドが SomeClass の状態を変更する場合、設計でこれを考慮しないと問題が発生する可能性があります。

アプローチ 4: 依存性注入。SomeClass のインスタンスを Foo のコンストラクターに挿入します。

  • 利点: 実行時に使用する SomeClass のインスタンスを指定できます。
  • 欠点: コードを呼び出すにはインスタンスを提供する必要があります。これは、達成しようとしている内容によっては不要になる場合があります。

    private mySomeClass;
    
    public Foo(SomeClass mySomeClass)
    {
        this.mySomeClass = mySomeClass;
    }
    
    public void method1(){
        if(mySomeClass != null)  mySomeClass.runSomething();
    }
    
于 2013-06-07T15:37:14.983 に答える
0

これは、初期化されたオブジェクトで何をしたいかによって異なります。

  • プロトタイプの場合、メソッドで初期化します
  • 1 対 1 の関係の場合は、合成を行います
  • 多対1の場合、シングルトンオブジェクトを作成し(コンストラクターを非表示にしSomeClassてプライベートにする)、次のようなメソッドを使用してすべての関連クラスのオブジェクトを取得しますSomeClass.getSingleton()

上記の各ケースには、マルチスレッド中に独自の結果があることに注意してください

于 2013-06-07T15:29:22.303 に答える