用匿名内部 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 不持有对外部对象的引用。