用匿名内部 class 初始化的静态字段有什么问题吗?
Is there anything wrong with static field initialised with anonymous inner class?
我在旧的遗留系统中找到了这段代码,如果没有问题,我不想碰它。
但是我觉得这段代码有一些缺陷,我找不到它。这只是不常见的模式还是存在一些隐藏的陷阱或内存泄漏?
private static final Foo action = new Foo() {
@Override
public void onAction(MyDialogFragment fragment) {
if (fragment.getContext() != null) {
fragment.getActivity().finish();
}
}
};
片段中使用了此代码
更新:
我怀疑匿名内部 class 的对象引用了父片段,并且由于这个 class 的对象保存在静态字段中,它永远不会被收集,所以父片段也永远不会被收集.我的推理错了吗?
是的。最好这样获取片段:
MyDialogFragment fragment = MyDialogFragment.instance();
fragment.setNavigator(this);
getSupportFragmentManager().beginTransaction().replace(R.id.activity_myDialog_layout, fragment).commit();
有更好的方法。您可以创建 3 类 和一个将由 3 类 实现的接口。 Activity, Fragment 和 Presenter。该界面将是合同。这个比较高级。
该方法没有任何问题,因为逻辑只处理作为参数传递的值。使用静态简单地避免创建 Foo class.
的多个实例
最好的解释在这里:
静态上下文中的匿名 class 不持有对外部对象的引用。
我在旧的遗留系统中找到了这段代码,如果没有问题,我不想碰它。
但是我觉得这段代码有一些缺陷,我找不到它。这只是不常见的模式还是存在一些隐藏的陷阱或内存泄漏?
private static final Foo action = new Foo() {
@Override
public void onAction(MyDialogFragment fragment) {
if (fragment.getContext() != null) {
fragment.getActivity().finish();
}
}
};
片段中使用了此代码
更新: 我怀疑匿名内部 class 的对象引用了父片段,并且由于这个 class 的对象保存在静态字段中,它永远不会被收集,所以父片段也永远不会被收集.我的推理错了吗?
是的。最好这样获取片段:
MyDialogFragment fragment = MyDialogFragment.instance();
fragment.setNavigator(this);
getSupportFragmentManager().beginTransaction().replace(R.id.activity_myDialog_layout, fragment).commit();
有更好的方法。您可以创建 3 类 和一个将由 3 类 实现的接口。 Activity, Fragment 和 Presenter。该界面将是合同。这个比较高级。
该方法没有任何问题,因为逻辑只处理作为参数传递的值。使用静态简单地避免创建 Foo class.
的多个实例最好的解释在这里:
静态上下文中的匿名 class 不持有对外部对象的引用。