这是否有意义 - 显示我想要释放SomeOtherBean的JVM / CDI容器?
@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);
}
}
答案 0 :(得分:3)
为什么不在SingleBean的构造函数上使用@Inject,如果你不再需要,就不要在某个字段中存储someotherbean的值。
答案 1 :(得分:2)
CDI系统几乎肯定会在其注册表中使用bean,因此您不会释放任何内存。但是,更好的方法是在实际应用时使用构造函数注入而不是@PostConstruct
,因为它更简单,更容易测试。
答案 2 :(得分:2)
对null
的分配不是必需的,因为SomeOtherBean
实例仍将从DI框架中引用。此外,众所周知,垃圾收集器不确定地释放内存。
正如其他人所说,你最好在构造函数中注入bean并在那里填充地图,而不是在@PostConstruct
方法中进行。
编辑(根据@ JanGalinski&#39评论):
关于"良好做法"问题的一部分,我不相信在一个字段中留下null
引用是一种好习惯。如果有人稍后扩展SingleBean
类并期望该字段具有对SomeOtherBean
的非空引用,该怎么办?你最终可能会得到NPE ......