gpt4 book ai didi

java - 为什么在WeakReference中使用final

转载 作者:行者123 更新时间:2023-11-30 03:22:13 26 4
gpt4 key购买 nike

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

}

我不明白为什么将 Final 关键字与 WeakReference 一起使用。该模式有什么好处吗?

最佳答案

实际上有两个不同的问题:为什么应该使用final以及为什么应该使用WeakReference

final 用于指示变量值在构造后不会改变。这记录了代码(读者很容易知道它不会改变),保护您免受此变量的意外更改,并且可能会提高运行时性能,因为 JVM 可能会对最终字段使用一些额外的优化。

使用WeakReference是为了避免不必要地延长AutoCompleteTextView对象的生命周期:如果它被其所有者丢弃,那么这个观察者也不应该保留它。

同时使用 final 修饰符和 WeakReference 类型并没有什么特别奇怪的。它们都达到了各自的目的。

关于java - 为什么在WeakReference中使用final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31085138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com