kotlin单列模式

来源:互联网 发布:lofter绑定独立域名 编辑:程序博客网 时间:2024/06/12 00:54

1.传统java模式:

class AppManagerUtils private constructor() {    companion object {        // Activity栈        private var activityStack: Stack<Activity>? = 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<AppManagerUtils>()////        fun getInstance(): AppManagerUtils{//            return appManager//        }    }


2.现代kotlin模式:

class AppManagerUtils private constructor() {    companion object {        // Activity栈        private var activityStack: Stack<Activity>? = 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<AppManagerUtils>()// 获取对象fun getInstance( ): AppManagerUtils{    //调用前先给值,否则报错,我觉得有点浪费资源,不过也能确保不会null    appManager = AppManagerUtils()    return appManager}
}

//拜托类

object NoNullExt {    /**     * 通用获取单列对象     */    fun<T> noNullClassObject():ReadWriteProperty<Any?,T>{        return OutClassObject<T>()    }}

//托管类

class OutClassObject<T>:ReadWriteProperty<Any?,T> {    // 定义一个可变变量保存委托值    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    }}




原创粉丝点击