java lazy 变量_kotlin中的Lateinit,lazy和singleton模式

我正在尝试将项目的某些部分从 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文件的影响尽可能小(这个Manager文件应该与其余的java代码一起工作),最好的方法是什么?我注意到我必须在伴随对象内的一些其他变量或函数中添加 @Jvmstatic 或 @Jvmfield ,这样我就不必更新在manager中调用这些静态字段的其他java文件 .

5)另外一个问题,如果这位经理现在在纯kotlin环境中工作,那么实现具有多个参数的单例类的最佳实践是什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值