如果你已经结束了,那么将它赋给java CDI / EJB bean引用是一个好习惯吗?

时间:2015-03-19 18:38:18

标签: java reference garbage-collection ejb cdi

这是否有意义 - 显示我想要释放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);
   }
}

3 个答案:

答案 0 :(得分:3)

为什么不在SingleBean的构造函数上使用@Inject,如果你不再需要,就不要在某个字段中存储someotherbean的值。

答案 1 :(得分:2)

CDI系统几乎肯定会在其注册表中使用bean,因此您不会释放任何内存。但是,更好的方法是在实际应用时使用构造函数注入而不是@PostConstruct,因为它更简单,更容易测试。

答案 2 :(得分:2)

null的分配不是必需的,因为SomeOtherBean实例仍将从DI框架中引用。此外,众所周知,垃圾收集器不确定地释放内存。

正如其他人所说,你最好在构造函数中注入bean并在那里填充地图,而不是在@PostConstruct方法中进行。

编辑(根据@ JanGalinski&#39评论):

关于"良好做法"问题的一部分,我不相信在一个字段中留下null引用是一种好习惯。如果有人稍后扩展SingleBean类并期望该字段具有对SomeOtherBean的非空引用,该怎么办?你最终可能会得到NPE ......