当前位置: 首页 > news >正文

kotlin实现java的单例模式

代码

package com.flannery.interviewdemo.singleinstance//https://blog.csdn.net/Jason_Lee155/article/details/128796742
Java实现
//public class SingletonDemo {
//    private static SingletonDemo instance=new SingletonDemo();
//    private SingletonDemo()
//    {
//
//    }
//    public static SingletonDemo getInstance()
//    {
//        return instance;
//    }
//}
// 饿汉式
object SingleInstance1// 懒汉式
Java实现
//public class SingletonDemo {
//    private static SingletonDemo instance;
//    private SingletonDemo(){}
//    public static SingletonDemo getInstance(){
//        if(instance==null){
//            instance=new SingletonDemo();
//        }
//        return instance;
//    }
//}
//
class SingletonDemo2 private constructor() {companion object {private var instance: SingletonDemo2? = nullget() {if (field == null) {field = SingletonDemo2()}return field}fun get(): SingletonDemo2 {//细心的小伙伴肯定发现了,这里不用getInstance作为为方法名,是因为在伴生对象声明时,内部已有getInstance方法,所以只能取其他名字return instance!!}}
}// 线程安全的懒汉式
//public class SingletonDemo {
//    private static SingletonDemo instance;
//    private SingletonDemo() {}
//    public static synchronized SingletonDemo getInstance() {//使用同步锁
//        if (instance == null) {
//            instance = new SingletonDemo ();
//        }
//        return instance;
//    }
//}
class SingletonDemo3 private constructor() {companion object {private var instance: SingletonDemo3? = nullget() {if (field == null) {field = SingletonDemo3()}return field}@Synchronizedfun get(): SingletonDemo3 {return instance!!}}}// 双重校验锁
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 SingletonDemo4 private constructor() {companion object {val instance: SingletonDemo4 by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {SingletonDemo4()}}
}// 静态内部类
//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 SingletonDemo5 private constructor() {companion object {val instance = SingletonHolder.holder}private object SingletonHolder {val holder= SingletonDemo5()}
}// Double check
class SingletonDemo6 private constructor(private val property: Int) {//这里参数可以根据实际需求发生改变companion object {@Volatile private var instance: SingletonDemo6? = nullfun getInstance(property: Int) =instance ?: synchronized(this) {instance ?: SingletonDemo6(property).also { instance = it }}}
}

java实现的双重校验反编译成smali

.class public LA001单例模式/DoubleCheckSingleInstance;
.super Ljava/lang/Object;
.source "DoubleCheckSingleInstance.java"# static fields
.field private static volatile instance:LA001单例模式/DoubleCheckSingleInstance;# direct methods
.method static constructor <clinit>()V.registers 1.prologue.line 4const/4 v0, 0x0sput-object v0, LA001单例模式/DoubleCheckSingleInstance;->instance:LA001单例模式/DoubleCheckSingleInstance;return-void
.end method.method public constructor <init>()V.registers 1.prologue.line 3invoke-direct {p0}, Ljava/lang/Object;-><init>()Vreturn-void
.end method.method public static getInstance()LA001单例模式/DoubleCheckSingleInstance;.registers 2.prologue.line 7sget-object v0, LA001单例模式/DoubleCheckSingleInstance;->instance:LA001单例模式/DoubleCheckSingleInstance;if-nez v0, :cond_13.line 8const-class v1, LA001单例模式/DoubleCheckSingleInstance;monitor-enter v1.line 9:try_start_7sget-object v0, LA001单例模式/DoubleCheckSingleInstance;->instance:LA001单例模式/DoubleCheckSingleInstance;if-nez v0, :cond_12.line 10new-instance v0, LA001单例模式/DoubleCheckSingleInstance;invoke-direct {v0}, LA001单例模式/DoubleCheckSingleInstance;-><init>()Vsput-object v0, LA001单例模式/DoubleCheckSingleInstance;->instance:LA001单例模式/DoubleCheckSingleInstance;.line 12:cond_12monitor-exit v1:try_end_13.catchall {:try_start_7 .. :try_end_13} :catchall_16.line 14:cond_13sget-object v0, LA001单例模式/DoubleCheckSingleInstance;->instance:LA001单例模式/DoubleCheckSingleInstance;return-object v0.line 12:catchall_16move-exception v0:try_start_17monitor-exit v1:try_end_18.catchall {:try_start_17 .. :try_end_18} :catchall_16throw v0
.end method

资料

Kotlin的5种单例模式

http://www.lryc.cn/news/151538.html

相关文章:

  • 使用 KeyValueDiffers 检测Angular 对象的变化
  • Macos 10.13.2安装eclipse
  • Android逆向学习(一)vscode进行android逆向修改并重新打包
  • 【深入浅出设计模式--状态模式】
  • Debezium系列之:Debezium Server在生产环境大规模应用详细的技术方案
  • Echart笔记
  • docker 笔记1
  • HTTP Get 和 Post 的区别
  • C++超级迷宫游戏
  • CUDA小白 - NPP(3) 图像处理 Color and Sampling Conversion
  • Android硬件通信之 串口通信
  • 高防服务器面对DDOS攻击的威胁有何必要性
  • VBA中如何将if写到一行
  • 性能测试,python 内存分析工具 -memray
  • Jmeter(二十八):beanshell的使用
  • 数学建模:层次分析法
  • POI-TL制作word
  • 大数据Flink(七十一):SQL的时间属性
  • 51单片机项目(7)——基于51单片机的温湿度测量仿真
  • 按钮控件之1---QPushButton 标准按钮/普通按钮控件
  • Ae 效果:CC Light Rays
  • MPI之通信模式(标准,缓存,同步,就绪)
  • 面试官:说一下 MyBatis 的一级缓存和二级缓存 ?
  • Ajax与jQuery
  • 色温曲线坐标轴的选取:G/R、G/B还是R/G、B/G ?
  • maven部署
  • docker进阶作业
  • HTML+JavaScript+CSS DIY 分隔条splitter
  • Oracle-day5:新增、复制建表、表结构、表数据、删除
  • Scratch 画画的技巧