如果你已经结束了,将 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...