kotlin实现java的单例模式

代码

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? = null
            get() {
                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? = null
            get() {
                if (field == null) {
                    field = SingletonDemo3()
                }
                return field
            }

        @Synchronized
        fun 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? = null
        fun getInstance(property: Int) =
            instance ?: synchronized(this) {
                instance ?: SingletonDemo6(property).also { instance = it }
            }
    }
}

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

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 4
    const/4 v0, 0x0

    sput-object v0, LA001单例模式/DoubleCheckSingleInstance;->instance:LA001单例模式/DoubleCheckSingleInstance;

    return-void
.end method

.method public constructor <init>()V
    .registers 1

    .prologue
    .line 3
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method public static getInstance()LA001单例模式/DoubleCheckSingleInstance;
    .registers 2

    .prologue
    .line 7
    sget-object v0, LA001单例模式/DoubleCheckSingleInstance;->instance:LA001单例模式/DoubleCheckSingleInstance;

    if-nez v0, :cond_13

    .line 8
    const-class v1, LA001单例模式/DoubleCheckSingleInstance;

    monitor-enter v1

    .line 9
    :try_start_7
    sget-object v0, LA001单例模式/DoubleCheckSingleInstance;->instance:LA001单例模式/DoubleCheckSingleInstance;

    if-nez v0, :cond_12

    .line 10
    new-instance v0, LA001单例模式/DoubleCheckSingleInstance;

    invoke-direct {v0}, LA001单例模式/DoubleCheckSingleInstance;-><init>()V

    sput-object v0, LA001单例模式/DoubleCheckSingleInstance;->instance:LA001单例模式/DoubleCheckSingleInstance;

    .line 12
    :cond_12
    monitor-exit v1
    :try_end_13
    .catchall {:try_start_7 .. :try_end_13} :catchall_16

    .line 14
    :cond_13
    sget-object v0, LA001单例模式/DoubleCheckSingleInstance;->instance:LA001单例模式/DoubleCheckSingleInstance;

    return-object v0

    .line 12
    :catchall_16
    move-exception v0

    :try_start_17
    monitor-exit v1
    :try_end_18
    .catchall {:try_start_17 .. :try_end_18} :catchall_16

    throw v0
.end method

资料

Kotlin的5种单例模式

相关推荐
xcl09254 小时前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
一 乐6 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
卓怡学长6 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn6 小时前
Spring 注解使用详解
java·spring
一条小小yu7 小时前
Spring IoC的理解
java·后端·spring
落魄实习生7 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
旺仔学长 哈哈7 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
自强的小白9 小时前
核心功能(Service接口)
java·mybatis
乌暮9 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习