为什么在 WeakReference 中使用 final
Why use final in WeakReference
Example is here
/**
* Static inner listener that keeps a WeakReference to the actual AutoCompleteTextView.
*
* This way, if adapter has a longer life span than the View, we won't leak the View, instead
* we will just leak a small Observer with 1 field.
*/
private static class PopupDataSetObserver extends DataSetObserver {
private final WeakReference mViewReference;
private PopupDataSetObserver(AutoCompleteTextView view) {
mViewReference = new WeakReference(view);
}
@Override
public void onChanged() {
final AutoCompleteTextView textView = mViewReference.get();
if (textView != null && textView.mAdapter != null) {
// If the popup is not showing already, showing it will cause
// the list of data set observers attached to the adapter to
// change. We can't do it from here, because we are in the middle
// of iterating through the list of observers.
textView.post(updateRunnable);
}
}
private final Runnable updateRunnable = new Runnable() {
@Override
public void run() {
final AutoCompleteTextView textView = mViewReference.get();
if (textView == null) {
return;
}
final ListAdapter adapter = textView.mAdapter;
if (adapter == null) {
return;
}
textView.updateDropDownForFilter(adapter.getCount());
}
};
}
我不明白为什么要对 WeakReference 使用 final 关键字。这个模式有什么好处吗?
实际上有两个不同的问题:为什么要使用 final
和为什么要使用 WeakReference
。
final
用于表示变量值在构造后永远不会改变。这记录了代码(读者很容易知道它不会更改),保护您免受此变量的意外更改,并可能提高运行时性能,因为 JVM 可能会对最终字段使用一些额外的优化。
使用WeakReference
是为了避免不必要地延长AutoCompleteTextView
对象的生命周期:如果它被它的所有者丢弃,那么这个观察者也不应该持有它。
同时使用 final
修饰符和 WeakReference
类型并没有什么特别奇怪的。他们都各司其职。
Example is here
/** * Static inner listener that keeps a WeakReference to the actual AutoCompleteTextView. ** This way, if adapter has a longer life span than the View, we won't leak the View, instead * we will just leak a small Observer with 1 field. */ private static class PopupDataSetObserver extends DataSetObserver { private final WeakReference mViewReference; private PopupDataSetObserver(AutoCompleteTextView view) { mViewReference = new WeakReference(view); } @Override public void onChanged() { final AutoCompleteTextView textView = mViewReference.get(); if (textView != null && textView.mAdapter != null) { // If the popup is not showing already, showing it will cause // the list of data set observers attached to the adapter to // change. We can't do it from here, because we are in the middle // of iterating through the list of observers. textView.post(updateRunnable); } }
private final Runnable updateRunnable = new Runnable() { @Override public void run() { final AutoCompleteTextView textView = mViewReference.get(); if (textView == null) { return; } final ListAdapter adapter = textView.mAdapter; if (adapter == null) { return; } textView.updateDropDownForFilter(adapter.getCount()); } };
}
我不明白为什么要对 WeakReference 使用 final 关键字。这个模式有什么好处吗?
实际上有两个不同的问题:为什么要使用 final
和为什么要使用 WeakReference
。
final
用于表示变量值在构造后永远不会改变。这记录了代码(读者很容易知道它不会更改),保护您免受此变量的意外更改,并可能提高运行时性能,因为 JVM 可能会对最终字段使用一些额外的优化。
使用WeakReference
是为了避免不必要地延长AutoCompleteTextView
对象的生命周期:如果它被它的所有者丢弃,那么这个观察者也不应该持有它。
同时使用 final
修饰符和 WeakReference
类型并没有什么特别奇怪的。他们都各司其职。