kotlin 中的单例模式

2022-11-25  本文已影响0人  Bfmall
/**
 * DESC   : kt中的单例模式
 */
const val KtBaseSingleTonTest01_TAG = "KtBaseSingleTonTest01"

/**
 * Java中的懒汉式 (双重校验)
 *
 * public class SingleTon {
    private static SingleTon instance;

    private SingleTon(){}

    public static SingleTon getInstance() {
        if (instance == null) {
            synchronized(SingleTon.class) {
                if (instance == null) {
                    instance = new SingleTon()
                }
            }
        }
        return instance;
        }
    }
*/


/**
 * kotlin懒汉式单例模式
 */
class SingleTonKt1 {
    companion object {
        private var instance : SingleTonKt1? = null
            get() {
                if (field == null) {
                    field = SingleTonKt1()
                }
                return field
            }


        @Synchronized
//        fun getKtInstance1() = instance
        fun getKtInstance1() = instance!!
    }

    fun getInfo() {
        Log.d(KtBaseSingleTonTest01_TAG, "getInfo==>")
    }
}


/**
 * kotlin懒汉式单例模式双重校验安全,类似java的双重校验
 */
class SingleTonKt2 {
    companion object {
        val instance : SingleTonKt2 by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            SingleTonKt2()
        }
    }

    fun getInfo() {
        Log.d(KtBaseSingleTonTest01_TAG, "getInfo==>")
    }
}

class KtBaseSingleTonTest01 {

    fun testSingletonKt01() {
        Log.d(KtBaseSingleTonTest01_TAG, "testSingletonKt01==>")
        /**
         * 如果getKtInstance1方法直接返回instance,instance可能为空,在调用的时候需要加非空判断
         * fun getKtInstance1() = instance
         * 调用如下:
         * SingleTonKt1.getKtInstance1()?.getInfo()
         */
        SingleTonKt1.getKtInstance1()?.getInfo()

        /**
         * 如果getKtInstance1方法返回instance!!,断言不为空,则在调用的时候无需再加非空判断
         * fun getKtInstance1() = instance!!
         * 调用如下:
         * SingleTonKt1.getKtInstance1().getInfo()
         */
        SingleTonKt1.getKtInstance1().getInfo()
    }

    fun testSingletonKt02() {
        SingleTonKt2.instance.getInfo()
    }
}
上一篇 下一篇

猜你喜欢

热点阅读