只用一行代码的单例模式

Posted Android每日一讲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只用一行代码的单例模式相关的知识,希望对你有一定的参考价值。

作为android开发者对Kotlin语言应该不会陌生,
下面这个单例模式就是用Kotlin写的,

object SimpleSingleton

是的你没看错,这一行代码就实现了一个单例。
为啥这么屌?

Java的五种单例模式写起来那叫一个复杂,
特别是在考虑了并发情况下单例的实现,最短的单例也要10行左右。

Kotlin是怎么做到的?

Kotlin的object

Kotlin有个 object 关键字,object所表示的意思是声明一个对象,
上面的代码的意思是声明了一个对象(不需要指定类),对象叫 SimpleSingleton,
这个对象会在class被加载的时候就实例化完成,所以它是线程安全的,
对应Java的话就是饿汉单例。
这么说可能不太好理解,下面是反编译它的字节码,

public final class SimpleSingleton {
  public static final SimpleSingleton INSTANCE;

  static {};
    Code:
       0new           #2                  // class SimpleSingleton
       3: dup
       4: invokespecial #25                 // Method "<init>":()V
       7: astore_0
       8: aload_0
       9: putstatic     #27                 // Field INSTANCE:LSimpleSingleton;
      12return
}

注意里面的 INSTANCE 对象,这里就是实例化后的单例。
这个类做的事情就是在静态代码块里通过构造方法实例化一个静态的对象,
翻译成Java代码会比较好理解,它是下面这样的

public final class SimpleSingleton {
    public static final SimpleSingleton INSTANCE = null;
    static {
        SimpleSingleton singleton = new SimpleSingleton();
    }
    private SimpleSingleton() {
        INSTANCE = this;
    }
}

怎么使用这个单例呢?

没接触过Kotlin的同学可能比较懵逼,这个单例我该怎么用?
特别是当它在和Java混编的时候Java该怎么调?

我们把上面的单例丰富一下,给它一个计算方法让它返回两个数的和,

object SimpleSingleton{
  fun getResult(a : Int, b : Int):Int {
    return  a + b
    }
}

可以忽略方法的声明和返回语法,这个不是我们要关注的重点。下面给出Java和Kotlin调用的代码,

//Java
SimpleSingleton.INSTANCE.getResult(12);

//Kotlin
SimpleSingleton.getResult(12);

唯一的区别是Java需要用 INSTANCE 来拿到单例对象而已。

语法糖

看了Kotlin编译后的字节码就明白了它的单例原理,其实只是一种语法糖,
在Kotlin中还有很多的语法糖,比如闭包,比如foreach(),以后会多多介绍Kotlin的东西。


以上是关于只用一行代码的单例模式的主要内容,如果未能解决你的问题,请参考以下文章

C#的单例模式[关闭]

如何写一个简单的单例模式?

Java中的单例模式

python中的单例设计模式

C# 两行代码实现 延迟加载的单例模式(线程安全)

多线程中的单例模式可能具有重复代码