如果你已经结束了,将 null 分配给 java CDI/EJB bean 引用是一个好习惯吗?
Is it a good practise to assign null to a java CDI/EJB bean reference if you are over with it?
这有意义吗 - 显示 JVM/CDI 容器我想释放 SomeOtherBean?
@Singleton
public class SingleBean {
@Inject
SomeOtherBean someBean;
private Map values;
@PostSonstruct
private void postConstruct() {
someBean.doThis();
someBean.doThat();
values = someBean.retrieveValues();
//...
someBean = null; //don't need this anymore.
}
public Object getValue(String key) {
return values.get(key);
}
}
CDI 系统几乎肯定会在其注册表中保留该 bean,因此您不会释放任何内存。不过,更好的方法是在可行的情况下使用构造函数注入而不是 @PostConstruct
,因为它更简单,更容易测试。
为什么不直接在 SingleBean 本身的构造函数上使用 @Inject 并且如果您不再需要某个其他 bean 的值,则不要将其存储在字段中。
没有必要分配给 null
,因为 SomeOtherBean
实例仍会从 DI 框架中引用。此外,众所周知,垃圾收集器不确定地释放内存。
正如其他人所建议的那样,您最好在构造函数中注入 bean 并在那里填充映射,而不是在 @PostConstruct
方法中进行。
编辑(根据@JanGalinski 的评论):
关于问题的 "good practice" 部分,我认为在字段中留下 null
参考不是一个好习惯。如果后来有人扩展了 SingleBean
class 并期望该字段具有对 SomeOtherBean
的非空引用怎么办?您可能最终会遇到 NPE...
这有意义吗 - 显示 JVM/CDI 容器我想释放 SomeOtherBean?
@Singleton
public class SingleBean {
@Inject
SomeOtherBean someBean;
private Map values;
@PostSonstruct
private void postConstruct() {
someBean.doThis();
someBean.doThat();
values = someBean.retrieveValues();
//...
someBean = null; //don't need this anymore.
}
public Object getValue(String key) {
return values.get(key);
}
}
CDI 系统几乎肯定会在其注册表中保留该 bean,因此您不会释放任何内存。不过,更好的方法是在可行的情况下使用构造函数注入而不是 @PostConstruct
,因为它更简单,更容易测试。
为什么不直接在 SingleBean 本身的构造函数上使用 @Inject 并且如果您不再需要某个其他 bean 的值,则不要将其存储在字段中。
没有必要分配给 null
,因为 SomeOtherBean
实例仍会从 DI 框架中引用。此外,众所周知,垃圾收集器不确定地释放内存。
正如其他人所建议的那样,您最好在构造函数中注入 bean 并在那里填充映射,而不是在 @PostConstruct
方法中进行。
编辑(根据@JanGalinski 的评论):
关于问题的 "good practice" 部分,我认为在字段中留下 null
参考不是一个好习惯。如果后来有人扩展了 SingleBean
class 并期望该字段具有对 SomeOtherBean
的非空引用怎么办?您可能最终会遇到 NPE...