gpt4 book ai didi

java - kotlin 中的 lateinit、懒惰和单例模式

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:52 24 4
gpt4 key购买 nike

我正在尝试将项目的某些部分从 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。在配套类(class)中,我得到以下代码。

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 ,这样我就不必更新其他具有在管理器中调用这些静态字段。

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

最佳答案

第一个答案没有解决同步问题,顺便说一句,这仍然是一个未被重视的复杂性。仍然有很多人跑来跑去说简单地做双重检查锁定。但是有一些非常有说服力的论据表明 DCL 并不总是有效。

不过,有趣的是,我最近遇到了同样的问题并找到了 this article .虽然我第一次发现它时不喜欢它,但我重新访问了几次并开始喜欢它,这在很大程度上是因为:

  • 作者去 Kotlin stdlib 获取了代码
  • 结果是一个参数化的机制,虽然有点丑陋,但可以重用,这是非常引人注目的

请注意,主要问题都在此处理中提出:

  • 同步
  • 复杂的初始化
  • 参数化初始化(在 Android 中至关重要,其中 Context god object 是不可磨灭的)
  • 生成的编译代码

简而言之,我认为这几乎是关于这个主题的第一个也是最后一个词,令人惊讶的是,在 Medium 上找到了。

关于java - kotlin 中的 lateinit、懒惰和单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47232665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com