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