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 方便。