2012-11-22 5 views
22

난 그냥 단지 정적 내부 클래스는 최상위 클래스로 취급된다는 사실에 저를 지적 ListView왜 ViewHolder 클래스는 ViewHolder 클래스에서 정적이어야합니까?

내 판독을 최적화하기 내가 정기적으로 사용하는 다음과 같은 패턴의 더 나은 이해를 위해 노력하고있다. 그와 같은 것의 이점은 멤버 클래스 (비 정적)에 비해 무엇입니까? 정적 내부 클래스를 사용

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Comment comment = getItem(position); 
    ViewHolder holder; 
    if (convertView == null){ 
     holder = new ViewHolder(); 
     convertView = LayoutInflater.from(context).inflate(R.layout.mylayout, null); 
     holder.nickname = (TextView) ((ViewGroup) convertView).findViewById(R.id.nickname); 
     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.nickname.setText(comment.getMember_nickname()); 
    CharSequence 
    return convertView; 
} 

public static class ViewHolder{ 
    TextView nickname; 
} 
+5

이 아닌 경우 클래스가 인스턴스에 연결되어 있기 때문에 완전히 불필요합니다. – njzk2

+0

@ njzk2 : 단점은 무엇입니까? –

+0

@ Jan1337z ViewHolder가 정적이 아닌 경우 어댑터의 각 인스턴스에 대한 클래스 객체의 인스턴스가 있다는 것이 단점입니다. – njzk2

답변

4

한 가지 장점은 내부 클래스는 외부 클래스의 인스턴스없이 정적 메소드에서 접근 할 수 있다는 것이다.

만약 비 정적 내부 클래스 :

class MyOuter { 
    private int x = 7; 
    public void makeInner() { 
     MyInner in = new MyInner(); 
     in.seeOuter(); 
    } 
    class MyInner { 
     public void seeOuter() { 
      System.out.println("Outer x is " + x); 
     } 
    } 
} 

public static void main(String[] args) { 
    MyOuter mo = new MyOuter(); 
    MyOuter.MyInner inner = mo.new MyInner(); 
    inner.seeOuter(); 
} 

내부 클래스가 정적 인 경우 :

class BigOuter { 
    static class Nest {void go() { System.out.println("hi"); } } 
} 

class Broom { 
    static class B2 {void goB2() { System.out.println("hi 2"); } } 
    public static void main(String[] args) { 
     BigOuter.Nest n = new BigOuter.Nest(); 
     n.go(); 
     B2 b2 = new B2(); 
     b2.goB2(); 
    } 
} 
+2

ViewHolder 패턴의 문제를 완벽하게 해결할 수 있는지 확실하지 않습니다 ... –

+0

@ j0k NathanZ는 "내 수치는 정적 인 내부 클래스가 최상위 클래스로 취급된다는 사실을 지적했습니다. (정적이 아닌) 멤버 클래스와 비교할 때 이점이 있습니까? " 내 대답은 ViewHolder 패턴을 반드시 참조해야하는 것은 아니며, 방금 정적이 아닌 내부 정적 클래스를 사용하는 이점 중 하나를 지적했습니다. 필자가 말할 수있는 한, 정적 내부 클래스 사용의 이점은 ViewHolder 패턴보다 더 많은 것이 었습니다. –

+0

@IllyesIstvan 당신은 이고르, 나 아니고 대답하고 싶습니다. – j0k

7

내 의견으로는 '우승으로 정적 ViewHolder 클래스를 가지고하는 것이 좋습니다 것입니다 어댑터 누출.

어댑터가 무거운 컬렉션 또는보기 (각 특정 경우에 따라 다름)를 유지하는 경우 어댑터를 유지하는 개체를 제어하는 ​​것이 좋습니다.

내부 클래스의 개체 인스턴스가 많으면 어댑터를 참조하는 개체가 있으므로 해당 개체를 유지하게됩니다. 태그가 관리되는 방법에주의해야합니다 (보기가 자동으로 정리/제거되는 데 문제가없는 경우>).

관련 문제