Android开发者必然都用过单例模式吧。
在处理一些在应用中只能存在一个实例的类的时候 我们时常会用单例模式。
通常单例
平时我们使用Java的时候,一个有效、安全的单例我们大概是这样实现的:
//懒汉单例
public class Single {
private static Single ourInstance;
public static Single getInstance() {
if (null == ourInstance) {
createInstance();
}
return ourInstance;
}
private synchronized static void createInstance() {
if (ourInstance == null) {
ourInstance = new Single();
}
}
private Single() {
}
}
kotlin中有神奇的魔法,我们只需用object
来修饰此类,kotlin会自动为你实现一个安全的单例:
object Single
不禁感叹一声:如此简洁、优雅
只需要考虑到对象不能有构造函数,因为我们不调用任何构造函数来访问它们
而且只会在第一次被调用时生成实例
一个栗子:
/**
* 继承BroadcastReceiver的一个单例
* Created by Song on 2017/9/1.
*/
object DemoSingle : BroadcastReceiver(){
//重写父类方法
override fun onReceive(p0: Context?, p1: Intent?) {
}
//定义新方法
fun doSomeThing(p0 : String) {
Log.d("single", p0)
}
}
Application
Application 我们在开发时也经常将其作为一个单例来使用,但由于Android框架实例化类的方式。而我尝试将它改写为上面描述的单例的时候,程序启动时就会抛出异常。
因此我们不得不使用伴生对象companion object
来实现这个伪单例
class MyKotlinApp : Application() {
companion object {
//标准委托,若在onCreate前调用此实例会直接抛出异常 IllegalStateException
// var instance: MyKotlinApp by Delegates.notNull()
//或者 这种方式不能处理基础数据类型 int, float ,double等
lateinit var instance :MyKotlinApp
}
override fun onCreate() {
super.onCreate()
instance = this
}
}
此处又出现了伴生对象、标准委托、懒加载等知识点,且看稍后说明
伴生对象
其实大多尝试过kotlin的coder都能在尝试中看出来其作用,主要是代替静态变量、静态方法的一种写法。
也确实如此,kotlin每个类都可以实现一个伴生对象,它是该类的所有实例共有的对象。它将类似于Java中的静态字段。
懒加载
-
lateinit
表示这个属性开始是没有值得,但是,在使用前将被赋值(否则,就会抛出异常)。
使用限制:lateinit
不能用于修饰基础类型(int、double等),且不能被赋值为null。 - 而
Delegates.notNull()
使用了标准委托中的非空委托,表示在使用这个字段时 如果该字段值为null则抛出异常IllegalStateException
关于标准委托,下次再和大家一起详细了解。
感谢您的阅读,若觉得对你有用,或者有疑问,欢迎联系我。
网友评论