object 生成类
public static final class MyObject {
public static final TestKt.MyObject INSTANCE;
public final void aaa() {
String var1 = "-------";
boolean var2 = false;
System.out.println(var1);
}
private MyObject() {
}
static {
TestKt.MyObject var0 = new TestKt.MyObject();
INSTANCE = var0;
}
}
companion object 匿名 生成java类名
public static final class Companion {
public final void b() {
Log.e(TestKt.TAG, "此时 companion object 表示 伴生对象");
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
从上面生成的java代码来看 companion object 与 object是:
共同点: 都是static final类 ,都是private构造器 , 方法都是final
不同点, object 算简单饿汉式单例,生成了实例
companion object 匿名 生成java类名为 Companion ,可能也是一个类中只能有一个companion object的原因
kotlin不加open 都是final类
加上 volatile 是为了可见性和禁止重排序,这样就可以保证把参数传递进去的同时,确保线程安全
https://blog.csdn.net/Coo123_/article/details/90677170
本文介绍了在 Kotlin 下,实现单例模式的一些代码技巧,希望对大家有所帮助。最后再简单总结一下。
- 无参单例模式,直接使用 Kotlin 的 object 即可,它是依赖类的初始化锁来保证线程安全。
- 带参单例模式,可以使用双重检查锁 + @Volatile 来实现,如果嫌麻烦还可以封装成 SingletonHolder。
- lazy() 委托确实可以实现延迟加载,但是在单例模式的场景下,不如直接用object 方便。