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

前言

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

一、懒人写法(恶汉式)

java中

 public class Singleton{
  public static final Singleton instance = new Singleton();
  public Singleton getInstance() {
    return instance;
  }
 }

kotlin中

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

object Singleton{}

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

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

java中

public class Singleton {
  public static Singleton instance = null;
  private Singleton (){}
  public Singleton getInstance() {
   if (instance == null) {
    instance = new Singleton();
   }
   return instance;
  }
}

kotlin中

class Singleton private constructor{
 companion object {
   val intance by lazy(LazyThreadSafetyMode.NONE) { Singleton() }
 }
}

三、线程同步单例1

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

java中

public class Singleton {
  private static Singleton instance = null;
  private Singleton (){}
  public static synchronized Singleton getInstance() {
   if (instance == null) {
    instance = new Singleton();
    }
   return instance;
  }
 }

kotlin中

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

四、线程同步单例2

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

java中双检锁单例

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

class Singleton private constructor(){
  companion object {
   val intance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { Singleton() }
 }
}

五、静态内部类单例

java中

public class Singleton {
 private Singleton (){}
 private static class Holder {
 private static Singleton instance = new Singleton();
 }
 public static Singleton getInstance(){
  return Holder.instance;
 }
}

kotlin中

class Singleton private constructor(){
  companion object {
   fun getInstance(): Singleton {
    return Holder.instance
   }
  }
  private object Holder {
   val instance = Singleton()
  }
 }

总结

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

(0)

相关推荐

  • Java设计模式之单例模式实例详解【懒汉式与饿汉式】

    本文实例讲述了Java设计模式之单例模式.分享给大家供大家参考,具体如下: 单例模式就是产生一个对象实例,供外外部访问. 它的应用场景就是在这个类在全局真资源需要统一访问,否则会造成混乱时,才有必要设计成单例. 懒汉式,就是在使用这个对象时,才去查看这个对象是否创建,如果没创建就马上创建,如果已经创建,就返回这个实例. 饿汉式,在加载这个类的时候就先创建好一个对象实例,等待调用. 两者的优缺点也能猜到,使用懒汉式,在反应速度上肯定要比饿汉式慢. 但是这个对象如果不被调用,那就节省了cpu和内存资

  • 23种设计模式(1) java单例模式

    23种设计模式第四篇:java单例模式 定义: 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例 单例模式的要点: 1.私有的构造方法     2.指向自己实例的私有静态引用     3.以自己实例为返回值的静态的公有的方法 单例模式根据实例化对象时机的不同分为两种: 一

  • java使用静态关键字实现单例模式

    本文为大家分享了使用静态关键字实现单例模式的具体代码,供大家参考,具体内容如下 单例模式:只能获得某个类的唯一一个实例 单例模式,不管什么时间点得到的对象都是同一个对象 看下面代码: /** * 单例模式 * @author xiongda * @date 2018年4月15日 */ public class SingletonMode { private static SingletonMode single =null; public int number = 1; //将构造方法定义为私有

  • java单例模式实现面板切换

    本文实例为大家分享了java单例模式实现面板切换的具体代码,供大家参考,具体内容如下 1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 private Singleton_(){ System.out.println("懒汉单例模式"); } private static Singleton_ single = null; //并对外只暴露get

  • Java单例模式实现静态内部类方法示例

    Singleton是众多设计模式中最容易理解的一种,也是众多设计模式中较为重要的一种设计模式.接下来我们看看具体介绍. Singleton模式实现的重点在于将构造函数私有化(private),并通过提供静态公有函数(public synchronized static xxx getInstance)来获取定义在类中的静态私有成员(private static xxx instance),通过一个简单的判断静态实例是否为空来控制这个类只能够new一次,即控制了一个类只能有单个实例,一般的实现如下

  • 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外部需要创建实例化对象时再进行实例化,进而达到Lazy Loading 的效果. 通过静态方法 getSingleton() 和private 权限构造方法为创建一个实例化对象提供唯一的途径. 不足:未考虑到多线程的情况下可能会存在多个访问者同时访问,发生构造出多个对象的问题,所以在多线程下不可用这种

  • Java单例模式简单介绍

    一.概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案.就笔者认为,单例就是不让外界创建对象. 1.1概念剖析 对于单例的话,从上面的概念剖析,应该满足下面的几个条件: 第一:单例类中只能有一个单例对象: 第二:单例类必须自己创建自己的唯一实例对象: 第三:这个实例对象能够给外界访问到,

  • Java单例模式下的MongoDB数据库操作工具类

    本文实例讲述了Java单例模式下的MongoDB数据库操作工具类.分享给大家供大家参考,具体如下: 我经常对MongoDB进行一些基础操作,将这些常用操作合并到一个工具类中,方便自己开发使用. 没用Spring Data.Morphia等框架是为了减少学习.维护成本,另外自己直接JDBC方式的话可以更灵活,为自己以后的积累留一个脚印. JAVA驱动版本: <!-- MongoDB驱动 --> <dependency> <groupId>org.mongodb</g

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

    前言 单例模式,一直以来是我们在日常开发中最常用的一种设计模式,更是面试中非常重要,也非常容易被问到的问题.在日常开发中,大家常用的语言还是Java,但今天我给大家带来的是在Kotlin语言中,单例模式是怎么编写的,并且会对比Java方式,下面话不多说了,来一起看看详细的介绍吧 一.懒人写法(恶汉式) java中 public class Singleton{ public static final Singleton instance = new Singleton(); public Sin

  • Kotlin中?和!!的区别详细对比

    前言 很多同学刚上手使用Kotlin知道它有针对Java NullPointerException的管理,而在Kotlin中?和!!均是和NullPointerException有关系,可他们的区别到底是什么呢?为什么别人开发的项目中出现了好多"?",而我读起来却满脸问号. 不懂就问百度呀,确实有人解释它们的区别,比如: 这是输入"kotlin ?和!!"搜索到的百度第一条答案,确实这位说的没错.不过我觉得对于一个刚接触KT(Kotlin)的新手来说,他恐怕需要有汉

  • Kotlin中的反射机制深入讲解

    前言 Java中的反射机制,使得我们可以在运行期获取Java类的字节码文件中的构造函数,成员变量,成员函数等信息.这一特性使得反射机制被常常用在框架中,想要比较系统的了解Kotlin中的反射,先从Java的反射说起. Java中的反射 通常我们写好的.java源码文件,经过javac的编译,最终生成了.class字节码文件.这些字节码文件是与平台无关的,使用时通过Classloader去加载这些.class字节码文件,从而让程序按照我们编写好的业务逻辑运行.Java的反射主要是从这些.class

  • java 中单例模式饿汉式与懒汉式的对比

    java 中单例模式饿汉式与懒汉式的对比 概念: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 以前我们的做法是设置一个全局变量,也就是让它使得一个对象被访问.但是它不能防止你实例多个对象.这时我们可以让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且提供一个访问该实例的方法. 通过上面的描述,我们可以看到单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 因此,创建一个类的实例

  • java协程框架quasar和kotlin中的协程对比分析

    目录 前言 快速体验 添加依赖 添加javaagent 线程VS协程 协程代码 多线程代码 协程完胜 后记 前言 早就听说Go语言开发的服务不用任何架构优化,就可以轻松实现百万级别的qps.这得益于Go语言级别的协程的处理效率.协程不同于线程,线程是操作系统级别的资源,创建线程,调度线程,销毁线程都是重量级别的操作.而且线程的资源有限,在java中大量的不加限制的创建线程非常容易将系统搞垮.接下来要分享的这个开源项目,正是解决了在java中只能使用多线程模型开发高并发应用的窘境,使得java也能

  • 对比Java讲解Kotlin中?.与!!.的区别

    前言 本文主要介绍了关于Kotlin中?.与!!.的区别,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1.?. //kotlin: a?.foo() //相当于java: if(a!=null){ a.foo(); } 2.!!. //kotlin: a!!.foo() //相当于java: if(a!=null){ a.foo(); }else{ throw new KotlinNullPointException(); } 时间宝贵的同学可以不要看下面的了(` _ `)

  • Kotlin中的5种单例模式示例详解

    前言 最近在学习Kotlin这门语言,在项目开发中,运用到了单例模式.因为其表达方式与Java是不同的.所以对不同单例模式的实现进行了分别探讨.主要单例模式实现如下: 饿汉式 懒汉式 线程安全的懒汉式 双重校验锁式 静态内部类式 PS:该篇文章不讨论单例模式的运用场景与各种模式下的单例模式的优缺点.只讨论在Java下不同单例模式下的对应Kotlin实现. 一.饿汉式实现 //Java实现 public class SingletonDemo { private static SingletonD

  • Kotlin中的Checked Exception机制浅析

    前言 现在使用Kotlin的Android开发者已经越来越多了. 这门语言从一开始的无人问津,到后来成为Android开发的一级语言,再到后来Google官宣的Kotlin First.Kotlin正在被越来越多的开发者接受和认可. 许多学习Kotlin的开发者之前都是学习过Java的,并且本身Kotlin就是一款基于JVM语言,因此不可避免地需要经常和Java进行比较. Kotlin的诸多特性,在熟悉Java的开发者看来,有些人很喜欢,有些人不喜欢.但即使是不喜欢的那些人,一旦用熟了Kotli

  • Java8中Optional类型和Kotlin中可空类型的使用对比

    本文主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 在 Java 8中,我们可以使用 Optional 类型来表达可空的类型. package com.easy.kotlin; import java.util.Optional; import static java.lang.System.out; /** * Optional.ofNullable - 允许传递为 null 参数 *

  • Java中单例模式详解

    单例模式概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Pr

随机推荐