前文带着大家看过 kotlin 实现 static 的集中方式,那么非常自然的,我们就会想到用 kotlin 实现静态单例应该怎么做,怎么做比较优雅
其实大家基本都可以想法的到,不管怎么我们都离不开 companion object 的,记住 companion object 只是生成了一个类中的静态内部类,作用只是衔接,自身不和我们写的类产生其他联系,根本我们还是要在 companion object 内部创建静态实例对象,方式也是2种,懒汉式和饿汉式,懒汉式代码上没有 java 那么繁琐,kotlin 直接提供了双重同步锁
直接看代码:
class BookKotlin {
fun speak() {}
companion object instance {
// 懒汉式,使用 LazyThreadSafetyMode.SYNCHRONIZED 双重同步锁
val one: BookKotlin by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
BookKotlin()
}
// 饿汉式,上来直接赋值
@JvmField
val two: BookKotlin = BookKotlin()
}
}
public final class BookKotlin {
@JvmField
public static final BookKotlin two;
private static final Lazy one$delegate;
public static final BookKotlin.instance instance = new BookKotlin.instance((DefaultConstructorMarker)null);
public final void speak() {
}
static {
one$delegate = LazyKt.lazy(LazyThreadSafetyMode.SYNCHRONIZED, (Function0)null.INSTANCE);
two = new BookKotlin();
}
public static final class instance {
// $FF: synthetic field
static final KProperty[] $$delegatedProperties = new KProperty[]{(KProperty)Reflection.property1(new PropertyReference1Impl(Reflection.getOrCreateKotlinClass(BookKotlin.instance.class), "one", "getOne()Lcom/bloodcrown/kotlintest/BookKotlin;"))};
public final BookKotlin getOne() {
Lazy var1 = BookKotlin.one$delegate;
KProperty var3 = $$delegatedProperties[0];
return (BookKotlin)var1.getValue();
}
private instance() {
}
// $FF: synthetic method
public instance(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
代码很简单,大家一看就懂,同步的部分涉及 kotlin 自身机制不再这里说明
最后吐槽,本文算的上我最短小的技术文章发了吧,但是希望大家觉得他虽短小单精悍,短就忍了,再不精悍那就不是男人了 ~
最后妹子镇楼,最近就图多,搂下的都是好图