只用一行代码的单例模式

作为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:
       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代码会比较好理解,它是下面这样的

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(1, 2);

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

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

语法糖

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

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-07-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习从入门到成神

Java知识点总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

21810
来自专栏吴伟祥

字段规范 原

6510
来自专栏PHP在线

mysql学习笔记

InnoDB引擎与MyISAM引擎 mysql是关系型数据库。其中的存储引擎可以show engines来查看。我的版本是5.6.26的,查看版本用selec...

29350
来自专栏Golang语言社区

go语言的sql包原理与用法分析

go的sql包是在pkg/database中,里面的两个包sql和sql/driver可以一起看。建议看这个两个包之前可以先看看sql文件夹下的doc.txt。...

30740
来自专栏程序员叨叨叨

【PHP】Propel的使用,看这一篇就够了

本文为学习Propel框架使用的笔记,默认已经安装好Propel环境,若有读者不知如何安装Propel,可参考《听说你PHP配置Composer遇到了一些困境》...

52150
来自专栏*坤的Blog

自写文件小工具类

18930
来自专栏我是攻城师

ElasticSearch+Solr几个case笔记

32240
来自专栏xingoo, 一个梦想做发明家的程序员

AngularJS API之toJson 对象转为JSON

toJson()能把对象序列化为json 方法讲解 这个方法最多支持2个参数: angular.toJson(obj, pretty); obj 是想要转换的...

25950
来自专栏别先生

Hibernate的核心对象关系映射

Hibernate的核心就是对象关系映射: 加载映射文件的两种方式:   第一种:<mapping resource="com/bie/lesson02/c...

25160
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十九天-加强1-Junit&类加载&反射&Properties&BeanUtils&xml&动态代理&数据库【悟空教程】

第二十九天-加强1-Junit&类加载&反射&Properties&BeanUtils&xml&动态代理&数据库【悟空教程】

23470

扫码关注云+社区

领取腾讯云代金券