Kotlin的单例
1. 使用object
object ObjectTest {
init {
println("ObjectTest init")
}
fun test() {
println("ObjectTest test")
}
}然后看看编译的字节码对应的java代码
public final class ObjectTest {
@NotNull
public static final ObjectTest INSTANCE = new ObjectTest();
private ObjectTest() {
}
public final void test() {
String var1 = "ObjectTest test";
System.out.println(var1);
}
static {
String var0 = "ObjectTest init";
System.out.println(var0);
}
}可以看见是一个饿汉式的单例模式,线程安全。这里的ObjectTest init,被编译成了static静态代码块,会在类加载的时候执行。
2. 使用companion object
class SingletonManager private constructor() {
init {
println("SingletonManager init")
}
companion object {
val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
SingletonManager()
}
}
}编译的字节码对应的java代码
public final class SingletonManager {
@NotNull
public static final Companion Companion = new SingletonManager.Companion((DefaultConstructorMarker)null);
@NotNull
private static final Lazy instance$delegate;
private SingletonManager() {
String var1 = "SingletonManager init";
System.out.println(var1);
}
public SingletonManager(DefaultConstructorMarker $constructor_marker) {
this();
}
static {
instance$delegate = LazyKt.lazy(LazyThreadSafetyMode.SYNCHRONIZED, (Function0)null.INSTANCE);
}
public static final class Companion {
private Companion() {
}
@NotNull
public final SingletonManager getInstance() {
Lazy var1 = SingletonManager.instance$delegate;
Object var2 = null;
return (SingletonManager)var1.getValue();
}
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}可以看见是懒汉式的,通过lazy初始化的,线程是否安全,取决于LazyThreadSafetyMode参数,默认是SYNCHRONIZED是线程安全的
3. 双检锁/双重校验锁
class SingletonManager private constructor() {
companion object {
@Volatile
private var instance: SingletonManager? = null
fun getInstance(): SingletonManager =
instance ?: synchronized(this) {
instance ?: SingletonManager().also { instance = it }
}
}
}和java的双重校验锁类似,懒汉,线程安全
4. 静态内部类
class SingletonManager private constructor() {
init {
println("ObjectTest init")
}
companion object {
fun getInstance() = Holder.INSTANCE
}
private object Holder {
val INSTANCE = SingletonManager()
}
}和java的静态内部类类似,懒汉,线程安全
5. 枚举 不详细介绍
新车首发,新的一年,只带想赚米的人
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠开户专线联系方式?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠客服热线?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠开户客服电话?(▲182(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠客服邮箱?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠客服微信?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
东方明珠客服开户联系方式【182-8836-2750—】?μ- cxs20250806
东方明珠客服电话联系方式【182-8836-2750—】?- cxs20250806】
东方明珠开户流程【182-8836-2750—】?薇- cxs20250806】
东方明珠客服怎么联系【182-8836-2750—】?薇- cxs20250806】