zoukankan      html  css  js  c++  java
  • Kotlin属性揭秘与延迟初始化特性

    在上一次https://www.cnblogs.com/webor2006/p/11210181.html学习了Kotlin的伴生对象,这次来学习属性相关的东东。

    属性揭秘:

    先声明一个属性:

    没啥可说的呀,很简单嘛,其实。。有深层次的东东,表现上看貌似是直接调用的age这个属性,其实是调用age的get方法,下面来看一个完整的例子:

    这里就可以给这个属性定义一个get方法来将该属性进行初始化,在Kotlin中get方法的定义跟Java形式上是有区别的,如下:

    其中类型是可以省略的,因为可以从get()进行推导:

    这里还是先保留,另外还可以通过直接赋值给属性的办法来初始化它,如下:

    接下来为了验证我们在调用属性是是调用属性的get方法,下面可以针对属性来在get()方法中打印一下日志,如下:

    接下来再定义它的set方法:

    接下来调用一下看一下是否调用了该属性的get 和 set,如下:

    确实如此!!接下来回到常规使用,咱们再定义一个新的成员:

    其实它是隐式有get和set方法,咱们显式的给它定义一下,IDE会给出冗余提示的:

    总结一下,对于Kotlin属性的完整声明其实格式为:

    其中再来说一下“backing filed,支撑字段(域)”,回顾下:

    如果说没有这个概念,那我们没法return,比如说我们试着改一下:

    此时会死循环,不信运行一下:

    因为:

    所以只能用backing field来解决。最后咱们从字体码的角度来观察一下是否默认属性真的生成为getter和setter方法,一切细节都会从字节码的角度看个透彻,如下:

    确实如此~~那如果说我们想某个属性的set方法或者set方法不能被外界调用,此时加上访问修饰符【关于访问修饰符会在之后详细学习】,下面先来看set方法:

    接下来看一个Getter方法,它跟Setter有一点不同,如下:

    看错误提示:

    所以咱们改一下:

    延迟初始化:

    我们知道在Koltin中声明的属性是必须被初始化或者将它定义成抽象的,如下:

    那如果说我们不想在定义时就给该属性赋值,而是想在以后某个时刻再给它赋值,延迟初始化机制就应运而生,具体是这么搞的:

    接下来咱们来模拟之后初始化的场景:

    所以加上初始化语句:

    所以下面将延迟初始化属性再总结下:

    Kotlin要求非空类型的属性必须要在构造方法中进行初始化,但是有时这种要求不太方便,比如可以通过依赖注入或是单元测试情况下进行属性的赋值,通过lateinit关键字标识属性为延迟初始化,需要满足以下3个条件:

    1、lateinit只能用在类体中声明的var属性上,不能用在primary constructor声明的属性上。

    2、属性不能拥有自定义的setter和getter,如下:

    3、属性类型需要为非空,且不能是原生数据类型,比如:

    因为有这个特性,所以像Spring依赖注入框也能顺利的整合Kotlin了。

  • 相关阅读:
    【转】【SEE】基于SSE指令集的程序设计简介
    【转】【Asp.Net】asp.net服务器控件创建
    ControlTemplate in WPF ——ScrollBar
    ControlTemplate in WPF —— Menu
    ControlTemplate in WPF —— Expander
    ControlTemplate in WPF —— TreeView
    ControlTemplate in WPF —— ListBox
    ControlTemplate in WPF —— ComboBox
    ControlTemplate in WPF —— TextBox
    ControlTemplate in WPF —— RadioButton
  • 原文地址:https://www.cnblogs.com/webor2006/p/11218167.html
Copyright © 2011-2022 走看看