用匿名内部类初始化的静态字段有什么问题吗?

时间:2018-09-20 15:42:45

标签: java android memory-leaks inner-classes

我在旧的旧系统中找到了这段代码,如果没有问题,我也不想碰它。

但是我觉得这段代码有一些缺陷,我找不到它。这是不常见的模式,还是存在一些隐患或内存泄漏?

private static final Foo action =  new Foo() {

    @Override
    public void onAction(MyDialogFragment fragment) {
        if (fragment.getContext() != null) {
            fragment.getActivity().finish();
        }
    }
};

此代码用于片段

更新: 我怀疑匿名内部类的对象具有对父片段的引用,并且由于此类的对象保存在静态字段中,因此它将永远不会被收集,因此父片段也将不会被收集。我的推理错了吗?

3 个答案:

答案 0 :(得分:3)

该方法没有错,因为逻辑仅处理作为参数传递的值。使用静态方法只是避免创建Foo类的多个实例。

答案 1 :(得分:1)

是的。最好得到这样的片段:

MyDialogFragment fragment = MyDialogFragment.instance();
fragment.setNavigator(this);
getSupportFragmentManager().beginTransaction().replace(R.id.activity_myDialog_layout, fragment).commit();

有一个更好的方法。您可以创建3个类以及将由这3个类实现的接口。活动,片段和演示者。该界面将是“合同”。这是更高级的。

答案 2 :(得分:0)

最佳解释在这里: https://stackoverflow.com/a/27739694/5868421

静态上下文中的匿名类不包含对外部对象的引用。