在 com.google.inject.AbstractModule#configure(com.google.inject.Binder) 开头检查空状态的目的是什么
What's the purpose of checking null state at the beginning of com.google.inject.AbstractModule#configure(com.google.inject.Binder)
这是 google 指南中的方法 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;
}
}
我想知道第一个语句是否是必要的,因为方法是 synchronized.That 是,如果我们删除第一个语句会有什么不同吗?
编辑:com.google.inject.AbstractModule
https://github.com/google/guice/blob/master/core/src/com/google/inject/AbstractModule.java
的源码来了
说的很清楚:"Re-entry is not allowed."
,不会让你调用两次configure。
您需要空值检查,因为这是一个抽象 class。如果 configure() 的实现将调用 configure(Builder) ,则可能会第二次进入该函数,因为它在同一个线程中运行,因此 synchronized
本身无法确保不会重新进入。顺便说一句,同步是空检查工作所必需的,所以你需要空检查和同步。
这是 google 指南中的方法 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;
}
}
我想知道第一个语句是否是必要的,因为方法是 synchronized.That 是,如果我们删除第一个语句会有什么不同吗?
编辑:com.google.inject.AbstractModule
https://github.com/google/guice/blob/master/core/src/com/google/inject/AbstractModule.java
说的很清楚:"Re-entry is not allowed."
,不会让你调用两次configure。
您需要空值检查,因为这是一个抽象 class。如果 configure() 的实现将调用 configure(Builder) ,则可能会第二次进入该函数,因为它在同一个线程中运行,因此 synchronized
本身无法确保不会重新进入。顺便说一句,同步是空检查工作所必需的,所以你需要空检查和同步。