美文网首页
Kotlin学习笔记-延迟加载

Kotlin学习笔记-延迟加载

作者: 珊珊宝贝Catherine | 来源:发表于2017-12-21 14:54 被阅读241次

    lazy:延迟加载

    1、 lazy提供了初始化的方法,不过真正初始化这个动作发生的时机却是在第一次被使用时。 
    2、 lazy()是一个函数, 可接受一个Lambda表达式作为参数,第一次调用将会执行 Lambda 表达式,以后调用该参数返回以前记住的结果. 
    3、 可以理解为lazy{…}函数的最后一行为返回值 
    4、 lazy只能实现对属性为val的初始化,对于var需要用lateinit 
    5、 lateinit的使用有很多限制的,比如只能在不可null的对象上使用,不能为primitives(Int、Float之类)等等
    

    延迟初始化属性与变量

    一般地,属性声明为非空类型必须在构造函数中初始化。 然而,这经常不方便。
    例如:属性可以通过依赖注入来初始化, 或者在单元测试的 setup 方法中初始化。 
    这种情况下,你不能在构造函数内提供一个非空初始器。但你仍然想在类体中引用该属性时避免空检查。
    

    为处理这种情况,你可以用 lateinit 修饰符标记该属性:

    public class MyTest {
        lateinit var subject: TestSubject
    
        @SetUp fun setup() {
            subject = TestSubject()
        }
    
        @Test fun test() {
            subject.method()  // 直接解引用
        }
    }
    

    该修饰符只能用于在类体中的属性(不是在主构造函数中声明的 var 属性,并且仅当该属性没有自定义 getter 或 setter 时),而自 Kotlin 1.2 起,也用于顶层属性与局部变量。该属性或变量必须为非空类型,并且不能是原生类型。

    在初始化前访问一个 lateinit 属性会抛出一个特定异常,该异常明确标识该属性被访问及它没有初始化的事实。

    检测一个 lateinit var 是否已初始化(自 1.2 起)

    要检测一个 lateinit var 是否已经初始化过,请在该属性的引用上使用 .isInitialized:

    if (foo::bar.isInitialized) {
        println(foo.bar)
    }
    

    此检测仅对可词法级访问的属性可用,即声明位于同一个类型内、位于其中一个外围类型中或者位于相同文件的顶层的属性。

    相关文章

      网友评论

          本文标题:Kotlin学习笔记-延迟加载

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