kotlin单列模式

1.传统java模式:

class AppManagerUtils private constructor() {

    companion object {
        // Activity栈
        private var activityStack: Stack? = null
        // 单例模式
        private var instance: AppManagerUtils? = null

        /**
         * 单一实例,加安全锁
         */
        val appManager: AppManagerUtils
            @Synchronized get() {
                if (instance == null) {
                    instance = AppManagerUtils()
                }
                return instance!!
            }

//        // 托管单例模式赋值
//        private var appManager : AppManagerUtils by Delegates.notNull()
//
//        fun getInstance(): AppManagerUtils{
//            return appManager
//        }
    }


2.现代kotlin模式:

class AppManagerUtils private constructor() {

    companion object {
        // Activity栈
        private var activityStack: Stack? = null
//        // 单例模式
//        private var instance: AppManagerUtils? = null
//
//        /**
//         * 单一实例,加安全锁
//         */
//        val appManager: AppManagerUtils
//            @Synchronized get() {
//                if (instance == null) {
//                    instance = AppManagerUtils()
//                }
//                return instance!!
//            }

        
// 托管单例模式赋值
private var appManager : AppManagerUtils by NoClassNullExt.noNullClassObject()
// 获取对象
fun getInstance( ): AppManagerUtils{
    //调用前先给值,否则报错,我觉得有点浪费资源,不过也能确保不会null
    appManager = AppManagerUtils()
    return appManager
}
}
 
  

//拜托类

object NoNullExt {

    /**
     * 通用获取单列对象
     */
    fun noNullClassObject():ReadWriteProperty{
        return OutClassObject()
    }
}

//托管类

class OutClassObject:ReadWriteProperty {
    // 定义一个可变变量保存委托值
    private var classValue:T? = null

    /**
     * 设置委托值
     * @param thisRef
     * @param property
     * @param value 委托传入的类对象值
     */
    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        if(classValue==null){
            classValue = value
        }
    }

    /**
     * 获取返回委托值,如果委托值=null,则抛出异常
     */
    override fun getValue(thisRef: Any?, property: KProperty<*>): T {
        if (classValue==null) {
            throw IllegalStateException("Error:${javaClass.name}-->如果变量的值null,则抛出异常。")
        }
        return classValue
    }
}




你可能感兴趣的:(Kotlin,开发大全)