美文网首页
Kotlin中的单例模式

Kotlin中的单例模式

作者: 程序员大耳 | 来源:发表于2020-04-01 14:31 被阅读0次

在 Java 开发中的单例模式一般都是私有化构造并且使用静态字段持有这个类仅有的实例。但是在 Kotlin 中并没有 static 关键字,那么单例模式该如何实现呢?

1、Kotlin 通过使用 “对象声明”功能为这一切提供了最高级的语言支持。

什么是对象声明呢?对象声明将类的声明与该类的单一实例声明结合到一起,也就是说,你可以像声明一个类一样声明一个对象,这个对象在定义的时候就创造了,不需要在任何地方调用构造方法初始化,因此,对象声明没有构造方法,并且是唯一实例。

例如:

object User{ // 使用 object 关键字声明对象,高效的定义了 User 类和他的一个变量

      val str = ""

      fun printStr(){}

  }

  // 可以直接通过对象名.属性名/方法名 调用

  User.INSTANCE.getStr()

  User.INSTANCE.printStr()

Kotlin 中一个关键字"object"实现单例模式。

2、主要单例模式实现如下:

饿汉式

懒汉式

线程安全的懒汉式

双重校验锁式

静态内部类式

一、饿汉式实现

//Java实现

public class SingletonDemo {

private static SingletonDemo instance=new SingletonDemo();

    private SingletonDemo(){

}

public static SingletonDemo getInstance(){

return instance;

    }

}

//Kotlin实现

object SingletonDemo

二、懒汉式实现

//Java实现

public class SingletonDemo {

private static SingletonDemo instance;

    private SingletonDemo(){}

public static SingletonDemo getInstance(){

if(instance==null){

instance=new SingletonDemo();

        }

return instance;

    }

}

//Kotlin实现

class SingletonDemoprivate constructor() {

companion object {

private var instance: SingletonDemo? =null

            get() {

if (field ==null) {

field = SingletonDemo()

}

return field

            }

fun get(): SingletonDemo{

//细心的小伙伴肯定发现了,这里不用getInstance作为为方法名,是因为在伴生对象声明时,内部已有getInstance方法,所以只能取其他名字

            return instance!!

}

}

}

三、线程安全的懒汉式

//Java实现

public class SingletonDemo {

private static SingletonDemo instance;

    private SingletonDemo(){}

public static synchronized SingletonDemo getInstance(){//使用同步锁

        if(instance==null){

instance=new SingletonDemo();

        }

return instance;

    }

}

//Kotlin实现

class SingletonDemoprivate constructor() {

companion object {

private var instance: SingletonDemo? =null

            get() {

if (field ==null) {

field = SingletonDemo()

}

return field

            }

@Synchronized

        fun get(): SingletonDemo{

return instance!!

}

}

}

四、双重校验锁式(Double Check)

//Java实现

public class SingletonDemo {

private volatile static SingletonDemo instance;

    private SingletonDemo(){}

public static SingletonDemo getInstance(){

if(instance==null){

synchronized (SingletonDemo.class){

if(instance==null){

instance=new SingletonDemo();

                }

}

}

return instance;

    }

}

//kotlin实现

class SingletonDemoprivate constructor() {

companion object {

val instance: SingletonDemoby lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED){

            SingletonDemo()}

    }

}

补充:如何在Kotlin版的Double Check,给单例添加一个属性,这里我给大家提供了一个实现的方式。

class SingletonDemoprivate constructor(private val property: Int) {//这里可以根据实际需求发生改变

    companion object {

@Volatile private var instance: SingletonDemo? =null

        fun getInstance(property: Int) =

instance ?:synchronized(this){

                    instance ?: SingletonDemo(property).also { instance =it }

}

    }

}

五、静态内部类式

//Java实现

public class SingletonDemo {

private staticclass SingletonHolder{

private static SingletonDemo instance=new SingletonDemo();

    }

private SingletonDemo(){

System.out.println("Singleton has loaded");

    }

public static SingletonDemo getInstance(){

return SingletonHolder.instance;

    }

}

//kotlin实现

class SingletonDemoprivate constructor() {

companion object {

val instance = SingletonHolder.holder

    }

private object SingletonHolder {

val holder= SingletonDemo()

}

}

相关文章

  • Kotlin 的单例模式

    Kotlin 的单例模式 1. 在 Java 中的单例模式 懒汉式单例模式,并且是线程安全 2. 在 Kotlin...

  • Kotlin单例模式使用案例

    Kotlin单例模式 1、kotlin的object就是一个单例模式,所有字段都是static静态,方法不是静态2...

  • Kotlin设计模式-单例模式

    单例模式是项目中最常见的工具类使用模式 kotlin中单例的最佳实践方式,线程安全的懒汉模式 java中调用 ko...

  • Kotlin学习笔记---单例模式(一)

    前言 关于单例模式,Java中最常见的设计模式,关于懒汉式还是饿汉式,各有优势,而Kotlin中也少不了单例模式,...

  • Kotlin 的单例模式

    Kotlin 的单例模式(5种) Kotlin 的5种单例模式: 饿汉式 懒汉式 线程安全的懒汉式 双重校验锁式 ...

  • Kotlin中的单例模式与Java对比

    目前java中的单例模式有多种写法,kotlin中的写法更多一点,本篇会总结全部的到单例模式写法。 一、懒人写法(...

  • kotlin精讲-第4章(5)kotlin Object关键字

    创建单例 Java中的单例 什么是单例?单例是一种设计模式,用来保证某一个类只有一个实例。在Kotlin中,Obj...

  • 单例模式

    单例模式 单例模式简介基本用法Kotlin 不带参Kotlin 带参饿汉式懒汉式双重校验锁静态内部类枚举集合管理问...

  • 使用Kotlin高效地开发Android App(五)完结篇

    一. 单例 使用 Java 来编写单例模式的话,可以写出好几种。同样,使用 Kotlin 也可以写出多种单例模式。...

  • 2020-09-30

    复合符号[Elvis 运算符] 单例模式 @JvmOverloads注解在Kotlin中@JvmOverloads...

网友评论

      本文标题:Kotlin中的单例模式

      本文链接:https://www.haomeiwen.com/subject/fhtauhtx.html