前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >只用一行代码的单例模式

只用一行代码的单例模式

作者头像
PhoenixZheng
发布2018-08-07 16:13:40
3780
发布2018-08-07 16:13:40
举报

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

代码语言:javascript
复制
object SimpleSingleton

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

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

Kotlin是怎么做到的?

Kotlin的object

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

代码语言:javascript
复制
public final class SimpleSingleton {
  public static final SimpleSingleton INSTANCE;

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

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

代码语言:javascript
复制
public final class SimpleSingleton {
    public static final SimpleSingleton INSTANCE = null;
    static {
        SimpleSingleton singleton = new SimpleSingleton();
    }
    private SimpleSingleton() {
        INSTANCE = this;
    }
}
怎么使用这个单例呢?

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

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

代码语言:javascript
复制
object SimpleSingleton{
  fun getResult(a : Int, b : Int):Int {
    return  a + b
    }
}

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

代码语言:javascript
复制
//Java
SimpleSingleton.INSTANCE.getResult(1, 2);

//Kotlin
SimpleSingleton.getResult(1, 2);

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

语法糖

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Kotlin的object
  • 怎么使用这个单例呢?
  • 语法糖
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档