我在旧的遗留系统中找到了这段代码,如果没有任何问题,我不想去碰它。
但是我觉得这段代码有一些缺陷,我找不到它。这是不是常见的模式,还是有一些隐藏的陷阱或内存泄漏?
private static final Foo action = new Foo() {
@Override
public void onAction(MyDialogFragment fragment) {
if (fragment.getContext() != null) {
fragment.getActivity().finish();
}
}
};
此代码用于片段
更新:我怀疑匿名内部类的对象引用了父片段,由于该类的对象保存在静态字段中,因此永远不会收集,因此也永远不会收集父片段。我的推理错了吗?
最好的解释如下:https://stackoverflow.com/a/27739694/5868421
静态上下文中的匿名类不包含对外部对象的引用。
是的,有。最好这样得到片段:
MyDialogFragment fragment = MyDialogFragment.instance();
fragment.setNavigator(this);
getSupportFragmentManager().beginTransaction().replace(R.id.activity_myDialog_layout, fragment).commit();
还有更好的方法。您可以创建3个类和一个由3个类实现的接口。活动、片段和演示者。接口将是合同。这是更先进的。
这种方法没有任何错误,因为逻辑只处理作为参数传递的值。使用静态可以简单地避免创建Foo类的多个实例。
报价王 JLS #8.1.3: 内部类不能声明静态初始值设定项 (§8.7)...... 这表现为: 现在既然Java的内部(非静态)类像其他类一样由类加载器加载,为什么我们不能为它们提供静态初始化器呢? 这一限制背后的原因是什么?
当一个类本身有一个静态实例时,我很难理解初始化顺序。另外,为什么
问题内容: 有什么方法可以初始化Java中的匿名内部类吗? 例如: 有没有办法在类声明中的某处使用例如putValue方法? 问题答案: 使用初始化程序块: 初始化实例成员 通常,您需要将代码放在构造函数中以初始化实例变量。使用构造函数初始化实例变量有两种选择:初始化块和final方法。实例变量的初始化块看起来像静态初始化块,但没有static关键字: Java编译器将初始化程序块复制到每个构造函
问题内容: 好吧,所以说我有一个看起来像这样的课: 我可以依靠类加载器来按顺序初始化那些字段,以便我可以依靠SERVLET_LOGGER在signupObservableAgent之前实例化吗? 问题答案: 是的,它们按照它们在源中出现的顺序进行了初始化。您可以在Java语言规范§12.4.2中阅读所有详细内容。请参阅步骤9,内容为: …以文本顺序执行类的类变量初始值设定项和静态初始值设定项,或者
静态字段何时初始化?如果我从未实例化过一个类,但我访问了一个静态字段,那么用于实例化私有静态字段的所有静态块和私有静态方法(按顺序)都在那一刻被调用了吗?或者什么时候启动应用程序?
问题内容: 下面的程序打印: 首次加载类时,首先要初始化静态块和字段,然后才初始化实例块和字段。因此,应首先初始化变量“ objectName1”和“ objectName2”,然后初始化实例变量“ list”……但输出显然与该理论相矛盾……任何人都可以解释程序行为(我不是在批评程序)。设计本身顺便说一句)? 问题答案: 静态块 按顺序 初始化(因此您可以在下面的代码中依赖上面的代码)。通过在中创