2

私の一般的な質問は、引数をいつコンストラクターに渡すか、いつ引数をクラスのメソッドに渡すかです。一般に、オブジェクトは「データ」+「データに作用するメソッド」です。

DFS というクラスを設計するためのオプションがいくつかあります。次のスイート定義の例のうち、どれが最適ですか?

オプション 1: コンストラクターで渡されたグラフ、関数のソース。Adv: 同じ DFS オブジェクトが別のソースで再利用されます。

public class DFS {
   Graph g;
   public DFS(Graph g) {
     this.g = g;
   }

   public void doDfs(int source) {
     // dfs computation
   }
}

オプション 2: 2 つのパラメーターを持ち、ポリモーフィズムのないコンストラクター 欠点: 新しいソースごとに、新しいオブジェクトを構築する必要があります。

public class DFS {
    Graph g;
    int source;   

    public DFS(Graph g, int source) {
      this.g = g;
      this.source = source;
    }

    public void doDfs() {
      // dfs computation
    }
 }

オプション 3: オーバーロード コンストラクター Adv: すべてのユース ケースを解決します。Dis: ポリモーフィズムにはコストがかかります。

public class DFS {
   Graph g;
   int source;   

   public DFS(Graph g) {
     this.g = g;
   }

   public DFS(Graph g, int source) {
     this.g = g;
     this.source = source;
   }

   public void doDfs() {
      doDfs(source);
   }

   public void doDfs(int source) {
     // dfs computation
   }
}

オプション 4: コンストラクターなし

public class DFS {

    DFS() { }

    public void doDFS(Graph g, int source) {
      this.g = g;
      this.source = source;
      // dfs computation
    }
 }
4

3 に答える 3

2

クラスの操作/定義に関連付けられているものがある場合、それはコンストラクターとして渡されることを意味します。これはまた、それを として持つことが非常に望ましいことを意味しimmutableます。例えば:

public class DFS {
   final Graph g;
   public DFS(Graph g) {
     this.g = g;
   }

   public void doDfs(int source) {
     // dfs computation
   }
}

ここで、このクラスDFSDFSは、グラフgの そのような場合、それgは不変であり、すべてのメソッド呼び出しでそれを渡すのは面倒なので、コンストラクター引数にすることをお勧めします。いくつかの利点:

  1. すべてのメソッド呼び出しに冗長な引数はありません。
  2. 内部キャッシングを行いたい場合は、それを行うことができます。これは、すべてが既知のエンティティに関連しているため機能します。g
  3. スレッド セーフ、明示的なロックなし。セッターで必要になります。

つまり、クラスの定義に関して何かが変更されないことがわかっている場合は、コンストラクターの引数として作成します。これらのインスタンス変数を使用するメソッドがあります。何かが変わる可能性があることがわかっている場合は、セッターを使用します。

于 2013-08-05T06:51:26.430 に答える
0

それは論理の問題です。クラスのオブジェクトが有効であるために特定のデータを必要とするようにクラスを設計した場合、コンストラクターでデータを提供する必要があります。を使用して、オブジェクトが実際に渡されることも確認する必要がありますassert

ただし、データが後で追加されるようにクラスを設計することもできます。クラスをどのように使用するかによって異なります。クラスのユーザー向けにクラスを設計する必要があります。

ところで、あなたは投稿で「ポリモーフィズムはコストがかかる」とコメントしています。いいえ、ポリモーフィズムがあなたのために仕事を成し遂げるものなら、それは高価ではありません. そして、それはあなたが意味するポリモーフィズムの種類にも依存します。

于 2013-08-05T07:01:21.943 に答える