在com.google.inject.AbstractModule#configure(com.google.inject.Binder)开头检查null状态的目的是什么



这是谷歌guice com.google.inject.AbstractModule#configure(com.google.inject.Binder)的方法:

public final synchronized void configure(Binder builder) {
  checkState(this.binder == null, "Re-entry is not allowed.");
  this.binder = checkNotNull(builder, "builder");
  try {
    configure();
  }
  finally {
    this.binder = null;
  }
}

我想知道第一个语句是否必要,因为该方法是同步的。也就是说,如果我们删除第一个语句有什么区别吗?

编辑:这是com.google.inject.AbstractModule https://github.com/google/guice/blob/master/core/src/com/google/inject/AbstractModule.java 的源代码

很清楚:"Re-entry is not allowed.",它不允许你调用配置两次。

您需要 null 检查,因为这是一个抽象类。如果configure((的实现调用configure(Builder(,则可以再次输入该函数,因为它在同一线程中运行,因此synchronized本身并不能确保没有重新进入。顺便说一句,同步是空检查工作所必需的,因此您需要空检查和同步。

最新更新