美文网首页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