美文网首页Kotlin编程手机移动程序开发
从零开始的Kotlin for Android 学习笔记2-从K

从零开始的Kotlin for Android 学习笔记2-从K

作者: ys尘笑 | 来源:发表于2017-09-01 17:48 被阅读126次

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

关于标准委托,下次再和大家一起详细了解。

感谢您的阅读,若觉得对你有用,或者有疑问,欢迎联系我。

相关文章

网友评论

    本文标题:从零开始的Kotlin for Android 学习笔记2-从K

    本文链接:https://www.haomeiwen.com/subject/zxxqjxtx.html