Android Studio Kotlin Application单例化 实例
第一种,是按照我们以前实现的单例模式
class FlashLight : Application() {
companion object {
// 按照我们在Java中一样创建一个单例最简单的方式:
private var instance:Application?=null;
fun instance()= instance!!;
}
override fun onCreate() {
super.onCreate()
instance=this;
}
}
第二种,使用Kotlin自带的单例模式,使用notNull委托
class FlashLight : Application() {
companion object {
// 单例不会是null 所以使用notNull委托
var instance: FlashLight by Delegates.notNull()
}
override fun onCreate() {
super.onCreate()
instance=this;
}
}
第三种,Kotlin库提供了几个接口,我们自己的委托必须要实现的几个接口,自定义单例模式,创建一个DelegatesExt.kt文件
/**
* Created by Jeff on 2018-02-1.
* Email : 15899859876@qq.com.
*/
object DelegatesExt {
//现在你可以创建一个对象,然后添加函数使用你的委托:
fun <T> notNullSingleValue(): ReadWriteProperty<Any?, T> = NotNullSingleValueVar()
fun <T> getPreference(context: Context, name: String, default: T): ReadWriteProperty<Any?, T> = Preference(context, name, default)
}
/**
* Kotlin库提供了几个接口,我们自己的委托必须要实
* 现: ReadOnlyProperty 和 ReadWriteProperty 。具体取决于我们被委托的对
* 象是 val 还是 var 。
* 我们要做的第一件事就是创建一个类然后继承 ReadWriteProperty */
class NotNullSingleValueVar<T> : ReadWriteProperty<Any?, T> {
private var value: T? = null
//Getter函数 如果已经被初始化,则会返回一个值,否则会抛异常。
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
return value ?: throw IllegalStateException("${property.name} not initialized")
}
//Setter函数 如果仍然是null,则赋值,否则会抛异常。
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
this.value = if (this.value == null) value else throw IllegalStateException("${property.name} not initialized")
}
}
/**
* 泛型preference委托
* 访问Shared Preferences
* **/
class Preference<T>(val context: Context, val name: String, val default: T) : ReadWriteProperty<Any?, T> {
val ref: SharedPreferences by lazy { context.getSharedPreferences("News", Context.MODE_PRIVATE) }
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
return findPreferenceByName(name, default)
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
putPreference(name, value)
}
private fun findPreferenceByName(name: String, default: T): T = with(ref) {
val res: Any = when (default) {
is Int -> getInt(name, default)
is Boolean -> getBoolean(name, default)
is String -> getString(name, default)
is Long -> getLong(name, default)
is Float -> getFloat(name, default)
else -> throw IllegalArgumentException("this type not support")
}
return res as T
}
private fun putPreference(name: String, value: T) = with(ref.edit()) {
when (value) {
is Int -> putInt(name, value)
is Boolean -> putBoolean(name, value)
is String -> putString(name, value)
is Long -> putLong(name, value)
is Float -> putFloat(name, value)
else -> throw IllegalArgumentException("this type not support")
}.apply()
}
}
在application里调用上面自定义的DelegatesExt
/**
* Created by Jeff on 2018-02-1.
* Email : 15899859876@qq.com.
*/
class FlashLight : Application() {
companion object {
// 按照我们在Java中一样创建一个单例最简单的方式:
// private var instance:Application?=null;
// fun instance()= instance!!;
// 单例不会是null 所以使用notNull委托
//var instance: FlashLight by Delegates.notNull()
// 自定义委托实现单例,只能修改这个值一次.
var instance: FlashLight by DelegatesExt.notNullSingleValue<FlashLight>()
}
override fun onCreate() {
super.onCreate()
instance=this;
}
}
直接调用 instance就可以了,或着使用FlashLight. instance
Toast.makeText( instance, “Hello, views!”, LENGTH_SHORT).show();
Toast.makeText( FlashLight. instance, “Hello, views!”, LENGTH_SHORT).show();