kotlin单列模式

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
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值