文章目录

  • I . 单例的懒汉式与恶汉式
  • II . Java 中的懒汉式与恶汉式
  • III . Kotlin 中对应 Java 的懒汉式与恶汉式
  • IV . Kotlin 对象 ( object ) 声明
  • V . Kotlin 伴生对象 ( companion object )
  • VI . ? 与 !! 作用

I . 单例的懒汉式与恶汉式


1 . 单例类简介 : 单例是保证在应用程序的内存中 , 只存在一个实例的设计模式 ;

① 饿汉式 : 这个类只要一声明对象 , 只要该类被调用到 , 不管有没有用到其单例对象 , 必须马上创建一个该单例对象 ( 类对象很饿 ) ;

② 懒汉式 : 声明类对象时 , 什么都不做 , 只有类获取单例对象时 , 才创建对象 ( 创建对象很懒 ) ; 只有类获取单例对象时 , 才创建对象 ;

2 . 单例类特点 :

① 私有静态化单例成员变量 ;

② 私有化构造函数 ;

③ 公共静态获取单例方法 ;

详细的 Java 与 Kotlin 单例示例详细看下面的四个示例

II . Java 中的懒汉式与恶汉式


1 . Java 饿汉式 单例模式 : 在类第一次被调用就创建单例对象 ;

package singleton.java;/*** 饿汉单例模式*      在类第一次被调用就创建单例对象*/
public class Student {// 1 . 私有静态化单例成员变量 ( 饿汉模式 )private static Student student = new Student();// 2 . 私有化构造函数private Student(){}// 3 . 公共静态获取单例方法public static Student getStudent(){return student;}}

2 . Java 懒汉式 单例模式 : 在单例对象获取时才创建单例对象 ;

package singleton.java;/*** 懒汉单例模式*      只有在单例对象获取时才创建单例对象*/
public class Student {// 1 . 私有静态化单例成员变量private static Student student;// 2 . 私有化构造函数private Student(){}// 3 . 公共静态获取单例方法public static Student getStudent(){// 懒汉模式if(student == null){student = new Student();}return student;}}

III . Kotlin 中对应 Java 的懒汉式与恶汉式


1 . Kotlin 饿汉单例模式 : Kotlin 饿汉单例模式很简单 , 一行代码即可实现 , 该行代码的作用等同于上面的 Java 中的 Student 饿汉式单例模式的一坨代码 ;

package singleton.kotlin/*** 饿汉式单例模式实现*      被 object 关键字修饰的类时静态类 , 该类的成员方法和变量都是静态的*      调用时直接使用 Student.study() 即可调用该方法 */
object Student {fun study(){println("学习")}
}

该示例涉及到对象声明 , 看下一小节说明 ;

2 . Kotlin 懒汉单例模式 : 该示例中涉及到了伴生对象 , 字段 getter 方法定义 , ? 和 !! 判空等额外知识点 ;

package singleton.kotlin/*** 懒汉式单例模式实现** 1 . 私有化构造函数*/
class Student private constructor() {/*** 伴生对象*/companion object {// 2 . 私有化静态变量 , 赋值为空// ? 符号表示该变量任何时候不会报空指针异常 , 该变量可以为 空 nullprivate var student : Student? = null//这是 Kotlin 中特有的 get set 方法定义方式//  在成员变量的下面可以直接定义该成员的 get() set() 方法get() {if (student == null){student = Student()}return student}// 3 . 公共 ( 默认 ) 静态方法 , 获取 student 成员//  !! 表示该对象必须不能为空public fun getSingleton() : Student{return student!!}/*** 定义普通方法*/fun study(){println("学习")}}}//调用单例方法测试
fun main() {//伴生对象方法 可以直接使用 Student.伴生对象方法 进行调用//学习Student.study()//学习Student.Companion.study()}

该示例涉及到伴生对象声明 , getter 方法 , ? 和 !! 等知识点 , 看下一小节说明 ;

IV . Kotlin 对象 ( object ) 声明


1 . object 对象声明 : Kotlin 中使用 object 声明一个 Student 类时 , 这个类是单例类 ;

object Student {fun study(){println("学习")}
}

2 . 单例类实例化时机 ( 饿汉模式由来 ) : 使用 object 声明 Student 单例类后 , 会立刻实例化该单例类 , 相当于饿汉单例模式 ;

3 . 继承特征 : object 修饰的单例类 , 可以继承其它类 ;

4 . object 声明的单例类对象调用 : 直接使用类名 Student 调用即可 , 该类名等同于单例对象 , 如调用上述单例类的 study() 方法 , 使用如下调用 ;

//调用 Student 单例对象的
Student.study()

V . Kotlin 伴生对象 ( companion object )


1 . 伴生对象 : 类内部的对象 , 使用 companion object 修饰 , 是伴生对象 ; 是类内部的单例类 ;

2 . 伴生对象名称 : 上面单例类的 懒汉模式 , 省略了伴生对象的名称 , 这种情况下使用默认名称 Companion ;

3 . 单例调用 : 可以直接使用类调用伴生对象的方法 , 上述定义的 Student 类 及伴生对象 , Student 与 Student.Companion 是等价的 ; 因此测试时 , 下面的两个方法都是调用伴生对象的方法 ;

//调用单例方法测试
fun main() {//伴生对象方法 可以直接使用 Student.伴生对象方法 进行调用//学习Student.study()//学习Student.Companion.study()}

VI . ? 与 !! 作用


? 和 !! 使用方式 : ? 和 !! 都是加在变量名后修饰变量名的 ;

① ? 作用 : 使用 ? 符号加在变量名后面 , 表示该变量可以被赋值成 null ;

② !! 作用 : 使用 !! 符号加在变量名后面 , 表示该变量不可以被赋值成 null ;

【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )相关推荐

  1. 单例设计模式懒汉式和恶汉式

    一,单例设计模式懒汉式和恶汉式 懒汉式在类加载时不初始化,延迟加载.(配置文件) 饿汉式在类加载时初始化,加载慢,获取对象快. 饿汉式是线程安全的, 懒汉式需要加synchronized,否则不安全. ...

  2. 单例模式 懒汉式与恶汉式

    单例模式 懒汉式与恶汉式_打不倒我的,会让我更坚强_百度空间 http://hi.baidu.com/5053738058/item/0853dde084d23fe5fa42ba18 转载于:http ...

  3. Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象

    1. 类 1.1. 类的定义 package cn.toto.scala.day2/*** 在Scala中,类并不用声明为public类型的.* Scala源文件中可以包含多个类,所有这些类都具有共有 ...

  4. php 恶汉单例,单例模式中懒汉式和恶汉式

    1.单例模式: 一.懒汉式: //懒汉式单例类.延迟加载,在第一次调用的时候实例化自己 public class SingleTon{ private static SingleTon instanc ...

  5. java 恶汉和懒汉_Java单例模式-懒汉式、恶汉式与线程安全问题

    Java的单例模式常见的分为懒汉式.饿汉式.静态内部类.枚举 通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数额控制并节约系统资源. 饿汉式: public cl ...

  6. Scala单例对象(伴生对象)

    概念 Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概 念).但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象 来模拟类对象,该 ...

  7. 单例模式-懒汉式和恶汉式

    单例 /*** @author jiyu* @date 2020/12/09 9:09* @description 单例模式 懒汉式 在第一次调用的时候实例化*/ public class Singl ...

  8. Kotlin学习历程——对象声明与伴生对象

    Kotlin语言中文站 对象声明 如下代码写法称为对象声明: object UserInfoManager {//用户类型val userType : Int = 0//获取用户登录信息fun get ...

  9. Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

最新文章

  1. 具有Python&OpenCV的本地二进制模式
  2. 用db-RDA进行微生物环境因子分析-“ggvegan“介绍
  3. 脱贫利器 | PYTHON多线程行情抓取工具实现
  4. centos6.0编译安装mysql5.5脚本
  5. 小 Q 与函数求和 1(牛客练习赛 81 E)
  6. java对象和json对象之间互相转换
  7. ElasticSearch的Object数据类型
  8. Kubernetes三周年,这仅仅是伟大征途的开始
  9. linux查看nec进程状态,【linux】 /proc/PID/stat
  10. java学习笔记(五)集合
  11. win11鼠标怎么在轮滑时只滚动一个屏幕 Windows11鼠标设置轮滑只滚动一个屏幕的步骤方法
  12. [学习css系列]纯css实现移入移出效果
  13. 如果你想专升本那就一定要看的文学常识完整版(三)
  14. aodv-uu 源码解读
  15. ai的预览模式切换_ai模式切换快捷键是什么,Adobe Illustrator模式切换快捷键是什么?...
  16. 群晖迅雷套件1.7.2(支持DSM6.x和DSM7. X系统)
  17. Mac电脑搭建wordpress教程
  18. html盒子距离上边距50px,Margin的垂直外边距问题
  19. ARM Cortex-M3 学习笔记(3)
  20. 每个销售员都需要掌握的获取新客户的9种方法

热门文章

  1. 曼哈顿距离(坐标投影距离之和)d(i,j)=|X1-X2|+|Y1-Y2|.
  2. freemarker程序开发
  3. 边工作边刷题:70天一遍leetcode: day 33-3
  4. 数学图形之罗马曲面(RomanSurface)
  5. WF单元测试系列3:测试Activity的行为
  6. 使用@Transactional应注意的问题
  7. 静态页面访问缓慢的问题
  8. 使用apply调用函数
  9. Tips-Windows 10【多桌面视窗】操作
  10. UnityShader入门精要-3.3 UnityShader的结构