2012-01-14 8 views
1

への参照を取得し、私はSO検索し、明らかに私の質問に関連するいくつかの答えを見つけ、そして同様に、以下を読んでいるしました:のJava(アンドロイド) - タイプ、ジェネリック、コンストラクタシグネチャ、クラス

http://docs.oracle.com/javase/tutorial/java/generics/erasure.html ます。http: //www.artima.com/weblogs/viewpost.jsp?thread=208860 http://docs.oracle.com/javase/tutorial/extra/generics/index.html http://docs.oracle.com/javase/tutorial/java/generics/genmethods.html

しかし、彼らはしています私の頭の上に少し(私はかなりJavaとAndroidの新しいです)。

カスタムクラスにジェネリックを実装する方法を理解しようとしています。私はその例を説明する最良の方法だと思います。

のは、私はこの基本クラスから始めましょう:

import java.util.ArrayList; 

import android.content.Context; 
import android.widget.ImageView; 

public class ViewPool { 

    private ArrayList<ImageView> employed; 
    private ArrayList<ImageView> unemployed; 

    private Context context; 

    public ViewPool(Context context){ 

     this.context = context; 

     employed = new ArrayList<ImageView>(); 
     unemployed = new ArrayList<ImageView>(); 

    } 

    public ImageView employView(){  
     ImageView v; 
     if(unemployed.size() > 0){ 
      v = unemployed.get(0); 
      unemployed.remove(v); 
     } else { 
      v = new ImageView(context); 
     } 
     employed.add(v); 
     return v; 
    } 

    public void retireView(ImageView v){ 
     if(employed.contains(v)){ 
      employed.remove(v); 
      unemployed.add(v); 
     } 
    } 
} 

は、今の私は、任意のビュータイプで動作するように上記を変更したいとしましょう、のように渡さ:

new ViewPool<ImageView>(this); 

か.. 。

new ViewPool<TextView>(this); 

このようなタイプを受け入れるために、上記のクラスをどのように書き直すのですか?私の最初の試み、この次のコードブロックのようなものは、おそらく明白な理由が何であるかのために失敗した...

public class ViewPool<E> { 
... 
    public E employView(){  
     E v; 
     if(unemployed.size() > 0){ 
      v = unemployed.get(0); 
      unemployed.remove(v); 
     } else { 
      v = new E(context); // this line's obviously bad, but not sure what would be correct 
     } 
     employed.add(v); 
     return v; 
    } 
... 

おかげ

答えて

3

あなたはあなたのビューをインスタンス化するために、その後

public class ViewPool<E extends View> 

を試みることができる、あなた

public abstract class ViewFactory<E extends View> { 
    public E createView(Context c); 
} 

のファクトリを使用し、ビュープールで次のように使用できます。 viewpoolのための建設時に依存性を注入し、Eの新しいインスタンスを取得:

public class ViewPool<E extends View> { 

ViewFactory<E> factory; 

public viewpool(ViewFactory<E> factory) { 
    this.factory = factory; 
} 

public E employView(){  
    E v; 
    if(unemployed.size() > 0){ 
     v = unemployed.get(0); 
     unemployed.remove(v); 
    } else { 
     v = factory.createView(context); 
    } 
    employed.add(v); 
    return v; 
} 

}

次に使ってviewpoolを作成:返信用

ViewFactory<TextView> factory = new ViewFactory<TextView>() { 
    public TextView createView(Context c) { 
     return new TextView(c); 
    } 
} 
new ViewPool<TextView>(factory); 
+0

感謝を...どのようにしてでしょうジェネリックへの参照を取得するため、新しいをインスタンス化することができますか? – momo

+0

私の例を見て、これを達成するために工場を使うべきです。 javaにはコンストラクタの継承がないため、コンストラクタの一般的な形式を使用してジェネリック表記からビューを作成することはできません。回避策(実際には良いデザイン)は工場を使うことです。さらに、プールにインスタンスを作成することからプーリングを分離し、オブジェクト作成を担当するオブジェクトに依存関係を明示的に宣言するという2つの利点があります。 – Snicolas

+0

ええ、私の最初のコメントの質問はあなたの事例が上がる前のことでした。私はあなたがしていることを見て、パターンを理解することができます。ありがとう – momo

関連する問題