2012-02-14 13 views
0

私は、製品の工場を作るための同様のクラスを持っている:パラメータ化されたメソッドを作成するにはどうすればよいですか?

package com.nda.generics; 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 

import com.nda.generics.Sizeable.Size; 

public class ProductFactory{ 

     private Collection<? extends Sizeable> sources; 

     public ProductFactory(Collection<? extends Sizeable> sources) { 
      this.sources=sources; 
     } 

     public void setSources(Collection<? extends Sizeable> sources) { 
      this.sources=sources; 
     } 

     public Collection<Product> makeProductList() { 

      Collection<Product> products=new ArrayList<Product>(); 

      for (Sizeable item:sources) { 

       switch(item.getSize()) { 

        case BIG: products.add(new Sausage()); break; 
        case MIDDLE: products.add(new Feets()); break; 
        case LITTLE: products.add(new Conservative()); break; 
       } 
      } 

      return products; 
     } 

     public class Conservative extends Product { 

      private Conservative(){} 
     } 

     public class Feets extends Product { 

      private Feets(){} 
     } 

     public class Sausage extends Product { 

      private Sausage(){} 
     } 
    } 

この工場は、動物の大きさを利用した製品のリストを作ります。しかし、私はまた、メソッド/クラスをパラメーター化して、新しいタイプのFeets(コンストラクターのパラメーターを使用)を使用するために、製品のタイプを設定する必要があります。どうしたらいいですか?ありがとうございました。

+0

私はあなたを助けることができるように感じるが、私はあなたの質問を理解していない。あなたのコンストラクタのパラメータは表示されません。あなたがそれらを事前に知っていれば、あなたは単にあなたの工場からそれらを渡すことができます。パラメータを事前に知らなければ、クラス引数を渡すことによって、実行時にどの型かを知らせる必要があります。 –

答えて

0

メソッドでは、未知数の文字列パラメータが必要であると言うことができます。

フィードコンストラクタはこのようなものになることがあります。

public class Feets extends Product { 
    private Feets(String... args){ 
    } 
} 

引数「引数」文字列の配列になります。

1

、私はこれがあなたのため....

public <T extends Product> T getNewProduct(Class<T> productClass, String param1, int param2) { 

    T product = productClass.newInstance(); 

    // Assuming your abstract Product class defines these setters 
    product.setStringParam(param1); 
    product.setIntParam(param2); 

    return product; 
} 

探しているものであると考えている。そして、あなたはサイドノートとして、また

// Assuming you want a Feet object.... 
Feet feet = productFactoryInstance.getNewProduct(Feet.class, "productParam1", productParam2); 

....このように呼び出すことができますProductFacotryをシングルトンにする必要があります。あなたが製品を得るためにそれを使用したいときだけ、あなたは1以上のものを必要としない、それは他の頭の痛みの多くを回避し、あなたがすることができます。これにそうように....

// Make ProductFacotry constructor private so you don't call "new" all over the place 
private ProductFactory() {} 

// Variable to hold your only instance of product factory (hence, singleton name...) 
private static ProductFactory INSTANCE = null; 

public static synchronized Get() { 
    if(INSTANCE == null) { 
    // You can call the constructor here, even though its private since you're 
    // inside the same class 
    INSTANCE = new ProductFactory(); 
    } 

    return INSTANCE; 
} 

そして、これを行う....

Feet feet = ProductFactory.Get().getNewProduct(Feet.class, "productParam1", productParam2); 
関連する問題