2012-01-14 3 views
1

에 대한 참조를 검색하는 내가 SO 검색 분명히 내 질문에 관련된 몇 가지 답을 발견하고,뿐만 아니라 다음 읽고했습니다자바 (안드로이드) - 종류, 제네릭, 생성자 서명, 클래스

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

그러나 그들은이야 내 머리 위로 조금 (나는 자바와 안드로이드에 상당히 익숙하다).

사용자 지정 클래스에 제네릭을 구현하는 방법을 이해하려고합니다. 예를 들어 설명하면 가장 좋은 방법 일 것이라고 생각합니다.

의 내가이 기본 클래스로 시작한다고 가정 해 봅시다 :

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); 
} 

그리고 뷰 풀에서 다음과 같이 사용하십시오.

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

덕분에 회신에 대한 ... 어떻게 다음과 같습니다 그런 다음 사용하여 viewpool을 만들

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위한 건설시 의존성을 주입, E의 새로운 인스턴스를 가져 제네릭에 대한 참조를 얻으므로 새 을 인스턴스화 할 수 있습니까? – momo

+0

제 예제를 살펴 보려면 공장을 사용해야합니다. java에는 생성자의 상속이 없으므로 일반 형식의 생성자를 사용하여 제네릭 표기법으로 뷰를 만들 수는 없습니다. 해결 방법은 실제로는 좋은 디자인을 사용하는 것입니다. 또한 풀의 인스턴스 생성에서 풀링을 분리하고 개체 생성을 담당하는 개체에 대한 종속성을 명시 적으로 선언하는 두 가지 이점이 있습니다. – Snicolas

+0

예, 첫 번째 코멘트의 질문은 예를 들어보기 전이었습니다. 나는 네가하고있는 것을보고 그 패턴을 이해할 수있다. 감사 – momo