Kotlin中单例模式和Java的对比浅析

前言

单例模式,一直以来是我们在日常开发中最常用的一种设计模式,更是面试中非常重要,也非常容易被问到的问题。在日常开发中,大家常用的语言还是Java,但今天我给大家带来的是在Kotlin语言中,单例模式是怎么编写的,并且会对比Java方式,下面话不多说了,来一起看看详细的介绍吧

一、懒人写法(恶汉式)

java中

javascript 复制代码
 public class Singleton{
  public static final Singleton instance = new Singleton();
  public Singleton getInstance() {
    return instance;
  }
 }

kotlin中

最简单的写法,直接用object声明

javascript 复制代码
object Singleton{}

二、基本懒加载(未实现线程同步)

注:这种方式实现了懒加载,但是不是线程安全的,可能在多个线程中创建多个不同的实例

java中

javascript 复制代码
public class Singleton {
  public static Singleton instance = null;
  private Singleton (){}
  public Singleton getInstance() {
   if (instance == null) {
    instance = new Singleton();
   }
   return instance;
  }
}

kotlin中

javascript 复制代码
class Singleton private constructor{
 companion object {
   val intance by lazy(LazyThreadSafetyMode.NONE) { Singleton() }
 }
}

三、线程同步单例1

注:其实kotlin这种写法可以说是java直译过来的,虽说是线程安全的,但是太影响效率,主要看下面这种

java中

javascript 复制代码
public class Singleton {
  private static Singleton instance = null;
  private Singleton (){}
  public static synchronized Singleton getInstance() {
   if (instance == null) {
    instance = new Singleton();
    }
   return instance;
  }
 }

kotlin中

javascript 复制代码
class Singleton private constructor(){
  companion object {
   lateinit var instance: Singleton
   @Synchronized
   fun get(): Singleton {
     if (instance == null) {
       instance = Singleton();
      }
    return instance!!
   }
  }
}

四、线程同步单例2

注:线程同步,懒加载,无同步引起的效率问题

java中双检锁单例

javascript 复制代码
public class Singleton {
  private static Singleton instance = null;
  private Singleton (){}
  public static Singleton getInstance() {
   if (instance == null) {
   synchronized (Singleton.class) {
     if (instance == null) {
      instance = new Singleton();
     }
    }
  }
  return instance;
 }
}

kotlin

javascript 复制代码
class Singleton private constructor(){
  companion object {
   val intance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { Singleton() }
 }
}

五、静态内部类单例

java中

javascript 复制代码
public class Singleton {
 private Singleton (){}
 private static class Holder {
 private static Singleton instance = new Singleton();
 }
 public static Singleton getInstance(){
  return Holder.instance;
 }
}

kotlin中

javascript 复制代码
class Singleton private constructor(){
  companion object {
   fun getInstance(): Singleton {
    return Holder.instance
   }
  }
  private object Holder {
   val instance = Singleton()
  }
 }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对ZaLou.Cn的支持。

更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2023最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

相关推荐
毕业设计制作和分享22 分钟前
springboot150基于springboot的贸易行业crm系统
java·vue.js·spring boot·后端·毕业设计·mybatis
不吃凉粉4 小时前
Android Studio USB串口通信
android·ide·android studio
zhangphil4 小时前
android studio设置大内存,提升编译速度
android·android studio
编程乐学5 小时前
安卓非原创--基于Android Studio 实现的天气预报App
android·ide·android studio·课程设计·大作业·天气预报·安卓大作业
小梁努力敲代码5 小时前
java数据结构--List的介绍
java·开发语言·数据结构
摸鱼的老谭6 小时前
构建Agent该选Python还是Java ?
java·python·agent
lang201509286 小时前
Spring Boot 官方文档精解:构建与依赖管理
java·spring boot·后端
夫唯不争,故无尤也6 小时前
Tomcat 启动后只显示 index.jsp,没有进入你的 Servlet 逻辑
java·servlet·tomcat
zz-zjx6 小时前
Tomcat核心组件全解析
java·tomcat
Deschen6 小时前
设计模式-外观模式
java·设计模式·外观模式