有时在android中,当为listviews创建自定义适配器时,程序员使用一个静态类(通常名为“Holder”)来保存自定义子视图的实例。例如:
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final Holder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.child_item, null);
CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkBox_child);
TextView tvName = (TextView) convertView.findViewById(R.id.textView_child_episodeName);
holder = new Holder();
holder.checkBox = checkBox;
holder.tvName = tvName;
convertView.setTag(holder);
}
else {
holder = (Holder) convertView.getTag();
}
...
...
return convertView;
}
static class Holder {
TextView tvName;
CheckBox checkBox;
}
我理解这个速度要快得多,因为每个引用都只保存并创建一次。
在我的代码中,我创建了一个非静态类,而不是静态的“Holder”类:
public class Holder {
private TextView tvName;
private CheckBox checkBox;
public TextView getTextView() {
return tvName;
}
public void setTextView(TextView tv) {
this.tvName = tv;
}
public CheckBox getCheckBox() {
return checkBox;
}
public void setProgressCheckBox (CheckBox cb) {
this.checkBox = cb;
}
}
我使用这个非静态类。现在的问题是 - 它的工作方式是否相同?如果没有,将内部非静态类字段设置为静态使它在速度方面基本相同吗?
答案 0 :(得分:0)
是的,有区别。它与Android无关,它更像是一个OO概念。速度是运行时实现的一个细节,通过简单地选择静态与实例,您无法在开发过程中预见到这一点。
请参阅 Java Static vs Instance 和 Static vs Instance Variables: Difference?
答案 1 :(得分:0)
尽可能使用静态。非静态内部类具有对拥有它的外部类的实例的引用。静态不会。这意味着非静态的内存会占用更多内存,并且会使清理内存变得更加困难(因为它会增加对外部类的额外引用)。这也意味着你可以在没有外部类的实例的情况下实例化它。
静态类没有这些限制。您可以创建一个没有父项实例的项目,并且它不会保留引用,因此不会导致泄漏。尽可能使用它们。