我正在尝试将我的项目的某些部分java
从kotlin
. 其中之一是单例管理器类。java类看起来像这样
public class Manager {
private static volatile Manager Instance = null;
private static final Object InstanceLock = new Object();
private Manager(Object1 object1, Object2 object2, Object3 object3){//...};
public static boolean isInitialized(){
synchronized(InstanceLock){
return Instance == null;
}
}
public static void initialize(Object1 object1, Object2 object2, Object3 object3){
if(Instance == null){
synchronized(InstanceLock){
if(Instance == null){Instance = new Manager(object1, object2, object3};
}
}
}
public static getInstance(){
Precondition.checkNotNull(Instance, msg...);
return Instance;
}
}
另外,我将.kt 反编译回java。在伴随类中,我得到以下代码。
public static final class Companion {
@Nullable
public final Manager getInstance() {
return Manager.instance;
}
private final void setInstance(Manager var1) {
Manager.instance = var1;
}
private final Object getInstanceLock() {
return Manager.InstanceLock;
}
public final boolean isInitialized() {
Object var1 = Manager.Companion.getInstanceLock();
synchronized(var1){}
boolean var4;
try {
var4 = Manager.Companion.getInstance() == null;
} finally {
;
}
return var4;
}
public final void initialize(@NotNull String string1, @NotNull String string2) {
Intrinsics.checkParameterIsNotNull(string1, "string1");
Intrinsics.checkParameterIsNotNull(string2, "string2");
if (((Manager.Companion)this).getInstance() == null) {
Object var3 = ((Manager.Companion)this).getInstanceLock();
synchronized(var3){}
try {
if (Manager.Companion.getInstance() == null) {
Manager.Companion.setInstance(new Manager(string1, string2, (DefaultConstructorMarker)null));
}
Unit var5 = Unit.INSTANCE;
} finally {
;
}
}
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
1) 如何通过在 kotlin 伴随对象中使用 lateinit 或lazy 来实现线程安全、单例?如我所见,反编译的 java 代码在初始化函数中有一个同步调用,但在同步主体中没有任何内容。
2)我认为 kotlin object/lazy 带有线程安全保证,我如何在双重检查锁定模式中利用它?
3)有比双重检查锁定模式更好的模式吗?假设构造函数确实需要参数。
4)由于我试图使将此管理器类转换为 kotlin 文件的影响尽可能小(此管理器文件应该与其余的 java 代码一起使用),最好的方法是什么?我确实注意到我必须在伴随对象内添加@Jvmstatic
或添加@Jvmfield
一些其他变量或函数,这样我就不必更新在管理器中调用这些静态字段的其他 java 文件。
5)另外的问题,如果这个管理器现在在纯 kotlin 环境中工作,实现具有多个参数的单例类的最佳实践是什么?