在这种情况下,静态支架和非静态支架之间是否有区别?

时间:2016-02-25 23:04:32

标签: android static-members

有时在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;
    }
}

我使用这个非静态类。现在的问题是 - 它的工作方式是否相同?如果没有,将内部非静态类字段设置为静态使它在速度方面基本相同吗?

2 个答案:

答案 0 :(得分:0)

是的,有区别。它与Android无关,它更像是一个OO概念。速度是运行时实现的一个细节,通过简单地选择静态与实例,您无法在开发过程中预见到这一点。

请参阅 Java Static vs InstanceStatic vs Instance Variables: Difference?

答案 1 :(得分:0)

尽可能使用静态。非静态内部类具有对拥有它的外部类的实例的引用。静态不会。这意味着非静态的内存会占用更多内存,并且会使清理内存变得更加困难(因为它会增加对外部类的额外引用)。这也意味着你可以在没有外部类的实例的情况下实例化它。

静态类没有这些限制。您可以创建一个没有父项实例的项目,并且它不会保留引用,因此不会导致泄漏。尽可能使用它们。