Kotlin的5种单例模式

这篇具有很好参考价值的文章主要介绍了Kotlin的5种单例模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近在学习Kotlin这门语言,在项目开发中,运用到了单例模式。因为其表达方式与Java是不同的。所以对不同单例模式的实现进行了分别探讨。主要单例模式实现如下:

  • 饿汉式

  • 懒汉式

  • 线程安全的懒汉式

  • 双重校验锁式

  • 静态内部类式

PS:该篇文章不讨论单例模式的运用场景与各种模式下的单例模式的优缺点。只讨论在Java下不同单例模式下的对应Kotlin实现。

一、饿汉式实现

//Java实现
public class SingletonDemo {
    private static SingletonDemo instance=new SingletonDemo();
    private SingletonDemo(){

    }
    public static SingletonDemo getInstance(){
        return instance;
    }
}
//Kotlin实现
object SingletonDemo

这里很多小伙伴就吃了一惊。我靠,一个object 关键字就完成相同的功能?一行代码?

Kotlin的对象声明

学习了Kotlin的小伙伴肯定知道,在Kotlin中类没有静态方法。如果你需要写一个可以无需用一个类的实例来调用,但需要访问类内部的函数(例如,工厂方法,单例等),你可以把该类声明为一个对象。该对象与其他语言的静态成员是类似的。如果想了解Kotlin对象声明的更多内容,可以去看看之前的文章。

到这里,如果还是有很多小伙伴不是很相信一行代码就能解决这个功能,我们可以通过一下方式查看Kotlin的字节码。

查看Kotlin对应字节码

Kotlin的5种单例模式

查看Kotlin字节码.png

我们进入我们的Android Studio(我的Android Studio 3.0,如果你的编译器版本过低,请自动升级) 选择Tools工具栏,选择"Kotlin",选择“Show Kotlin Bytecode"

选择过后就会进入到下方界面:

Kotlin的5种单例模式

查看Kotlin字节码.png

点击"Decompile" 根据字节码得到以下代码:

public final class SingletonDemo {
   public static final SingletonDemo INSTANCE;
   private SingletonDemo(){}
   static {
      SingletonDemo var0 = new SingletonDemo();
      INSTANCE = var0;
   }
}

通过以上代码,我们了解事实就是这个样子的,使用Kotlin"object"进行对象声明与我们的饿汉式单例的代码是相同的。

二、懒汉式

//Java实现
public class SingletonDemo {
    private static SingletonDemo instance;
    private SingletonDemo(){}
    public static SingletonDemo getInstance(){
        if(instance==null){
            instance=new SingletonDemo();
        }
        return instance;
    }
}
//Kotlin实现
class SingletonDemo private constructor() {
    companion object {
        private var instance: SingletonDemo? = null
            get() {
                if (field == null) {
                    field = SingletonDemo()
                }
                return field
            }
        fun get(): SingletonDemo{
        //细心的小伙伴肯定发现了,这里不用getInstance作为为方法名,是因为在伴生对象声明时,内部已有getInstance方法,所以只能取其他名字
         return instance!!
        }
    }
}

上述代码中,我们可以发现在Kotlin实现中,我们让其主构造函数私有化自定义了其属性访问器,其余内容大同小异。

  • 如果有小伙伴不清楚Kotlin构造函数的使用方式。请点击

  • 不清楚Kotlin的属性与访问器,请点击

三、线程安全的懒汉式

//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 SingletonDemo private constructor() {
    companion object {
        private var instance: SingletonDemo? = null
            get() {
                if (field == null) {
                    field = SingletonDemo()
                }
                return field
            }
        @Synchronized
        fun get(): SingletonDemo{
            return instance!!
        }
    }

}

大家都知道在使用懒汉式会出现线程安全的问题,需要使用使用同步锁,在Kotlin中,如果你需要将方法声明为同步,需要添加@Synchronized注解。

四、双重校验锁式(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 SingletonDemo private constructor() {
    companion object {
        val instance: SingletonDemo by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
        SingletonDemo() }
    }
}

小伙伴们惊不惊喜,感不感动啊。我们居然几行代码就实现了多行的Java代码。其中我们运用到了Kotlin的延迟属性 Lazy

Lazy是接受一个 lambda 并返回一个 Lazy 实例的函数,返回的实例可以作为实现延迟属性的委托: 第一次调用 get() 会执行已传递给 lazy() 的 lambda 表达式并记录结果,后续调用 get() 只是返回记录的结果。

这里还有有两个额外的知识点。

  • 高阶函数,高阶函数是将函数用作参数或返回值的函数。大家还是看这个 ---​ ​高阶函数​​

  • 委托属性​​

五、静态内部类式

//Java实现
public class SingletonDemo {
    private static class SingletonHolder{
        private static SingletonDemo instance=new SingletonDemo();
    }
    private SingletonDemo(){
        System.out.println("Singleton has loaded");
    }
    public static SingletonDemo getInstance(){
        return SingletonHolder.instance;
    }
}
//kotlin实现
class SingletonDemo private constructor() {
    companion object {
        val instance = SingletonHolder.holder
    }

    private object SingletonHolder {
        val holder= SingletonDemo()
    }
}

静态内部类的实现方式,也没有什么好说的。Kotlin与Java实现基本雷同。

六、补充

那么如果小伙伴问,如何在Kotlin版的Double Check,给单例添加一个属性,这里给大家提供了一个实现的方式:

class SingletonDemo private 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 }
                }
    }
}

其中关于​​?:​​​操作符,如果 ​​?:​​ 左侧表达式非空,就返回其左侧表达式,否则返回右侧表达式。 请注意,当且仅当左侧为空时,才会对右侧表达式求值。

具体的kotlin语法糖,文中链接可以跳转kotlin中文网看看啦。文章来源地址https://www.toymoban.com/news/detail-429127.html

到了这里,关于Kotlin的5种单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity的三种单例模式(饿汉,懒汉,MonoBehaviour)

    单例的使用场景 ​ 对象全局唯一,且经常被使用。 static静态字段介绍 所有对象共享static属性,即static属性在此类中是唯一的。 static属性不会被GC回收,随着程序开始而创建,随着程序结束而销毁(so 不要滥用单例哦) 学过面向对象的小伙伴对static想必都不陌生,其具有的特质

    2023年04月15日
    浏览(42)
  • kotlin实现单例模式

    kotlin实现单例模式,大体分为两种方式,一种饿汉式单例模式,一种懒汉式单例模式。 1.饿汉式单例模式 在类前面加上object,就实现了饿汉式单例模式: 在kotlin中规定,使用object修饰的类只能有一个实例。这种方式基本就能应对大部分的情况,而且这种方式在类加载

    2024年02月06日
    浏览(34)
  • Kotlin单例模式的一种懒汉模式写法

    Kotlin单例模式的一种懒汉模式写法 kotlin用object实现单例模式,companion object与java静态_zhangphil的博客-CSDN博客 kotlin中很容易使用object实现java中的单例模式。由于kotlin中没有static修饰词,可以用companion object实现Java中的static效果。kotlin用object实现单例模式,companion object与java静态

    2024年02月12日
    浏览(36)
  • kotlin实现java的单例模式

    Kotlin的5种单例模式

    2024年02月10日
    浏览(37)
  • Kotlin对象和单例模式:探索这种强大设计模式的好处

    在Kotlin中,使用\\\"object\\\"来定义一个单例对象。所谓单例对象,就是在整个应用程序中只有一个实例存在。简单来说,就好像只有一个蜘蛛侠一样,不可能同时有多个蜘蛛侠存在(除非是在处理平行宇宙的故事情节,但那是另外一回事)。在Kotlin中,单例对象也是如此。

    2024年02月10日
    浏览(48)
  • Kotlin学习 - 数据类与单例类

    数据类 在Java代码中,数据类通常需要重写 equals()、hashCode()、toString() 这几个方法。虽然有快捷方式可以自动生成,但是还是要我们去点击生成下,并且一个简单的数据类就算没有其他复杂逻辑看着也挺繁琐的,代码如下: Kotlin中的数据类自动帮我们解决了这个问题,同样新

    2024年02月09日
    浏览(39)
  • 设计模式学习(一)单例模式补充——单例模式析构

    目录 前言 无法调用析构函数的原因 改进方法 内嵌回收类 智能指针 局部静态变量 参考文章 在《单例模式学习》中提到了,在单例对象是通过 new 动态分配在堆上的情况下,当程序退出时,不会通过C++的RAII机制自动调用其析构函数。本文讨论一下这种现象的原因以及

    2024年03月19日
    浏览(53)
  • 【设计模式学习1】什么是单例模式?单例模式的几种实现。

    单例模式是在内存中只创建一个对象的模式,它保证一个类只有一个实例。 如上图所示,多线程情况下,在时刻T,线程A和线程B都判断single为null,从而进入if代码块中都执行了new Single()的操作创建了两个对象,就和我们当初的单例初衷相悖而行。 1、第一次判空目的:为了缩

    2024年02月15日
    浏览(55)
  • 学习笔记-设计模式-创建型模式-单例模式

    一个类只有一个实例,并提供一个全局访问此实例的点,哪怕多线程同时访问。 单例模式主要解决了 一个全局使用的类被频繁的创建和消费 的问题。 单例模式的案例场景 数据库的连接池不会反复创建 spring中一个单例模式bean的生成和使用 在我们平常的代码中需要设置全局

    2024年02月08日
    浏览(52)
  • C++学习—单例模式

    目录 ​编辑 一,单例模式介绍 二,单例模式下的两种模式  1,饿汉模式 2,懒汉模式   单例:在全局只有一份实例。 单例模式是编程的经典模式之一。 二,单例模式下的两种模式  1,饿汉模式 饿汉模式:在main函数启动前就先把实例化的类对象准备好。 1,提前准备好实

    2024年02月19日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包