在上一次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了。

Kotlin属性揭秘与延迟初始化特性的更多相关文章

  1. Effective Java 第三版——83. 明智谨慎地使用延迟初始化

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  2. Spring:延迟初始化

    ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化.提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并 ...

  3. python之懒惰属性(延迟初始化)

    Python 对象的延迟初始化是指,当它第一次被创建时才进行初始化,或者保存第一次创建的结果,然后每次调用的时候直接返回该结果.延迟初始化主要用于提高性能,避免浪费计算,并减少程序的内存需求. 1. ...

  4. 谷歌钦定的编程语言Kotlin大揭秘

    第一时间关注程序猿(媛)身边的故事 谷歌钦定的编程语言Kotlin大揭秘 语法+高级特性+实现原理:移动开发者升职加薪宝典! 谷歌作为世界级的科技公司巨头,强悍的技术研发与创新能力使其一直是业界的楷模 ...

  5. C#性能优化之Lazy<T> 实现延迟初始化

    在.NET4.0中,可以使用Lazy<T> 来实现对象的延迟初始化,从而优化系统的性能.延迟初始化就是将对象的初始化延迟到第一次使用该对象时.延迟初始化是我们在写程序时经常会遇到的情形,例 ...

  6. C#性能优化:延迟初始化Lazy<T>

    1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...

  7. C# 延迟初始化

    一个对象的延迟初始化意味着该对象的创建将会延迟至第一次使用该对象时.(在本主题中,术语“延迟初始化”和“延迟实例化”是同义词.)延迟初始化主要用于提高性能,避免浪费计算,并减少程序内存要求. 以下是最 ...

  8. Lazy<T>延迟初始化

    延迟初始化:Lazy<T> 1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延 ...

  9. 双重检查锁定与延迟初始化(转自infoq)

    很好的文章,转自http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization 在java程序中,有 ...

随机推荐

  1. [LeetCode] 237. Delete Node in a Linked List 删除链表的节点

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  2. MySQL之备份

    MySQL备份和备份 备份/还原 冷备:需要停止当前正在运行mysqld,然后直接拷贝或打包数据文件. 半热备:mysqldump+binlog --适合数据量比较小的应用 在线热备:AB复制 --实 ...

  3. filter和map内置函数

    filter filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回 ...

  4. Python界面常用GUI包

    作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,这时候我们就需要一些界面库来帮助我们快速搭建界面,python的界面库很多,我认识的并不多,这里只列出几种我认识的 1.tkin ...

  5. PHP 23种设计模式

    学习PHP,对设计模式永远是逃不掉的:今天把php23种设计模式及其demo好好整理如下: 记录PHP关于23种设计模式的简单Demo. Demo地址:https://segmentfault.com ...

  6. [IOT] - Raspbian Buster 设置固定 IP

    背景 Raspberry Pi 4 + Raspbian Buster 配置步骤 1. 打开文件 "/etc/dhcpcd.conf" 进行配置. 2. 有线网卡配置固定IP in ...

  7. Kafka Streams | 流,实时处理和功能

    1.目标 在我们之前的Kafka教程中,我们讨论了Kafka中的ZooKeeper.今天,在这个Kafka Streams教程中,我们将学习Kafka中Streams的实际含义.此外,我们将看到Kaf ...

  8. CF1016D Vasya And The Matrix

    题目描述 我们有一个 n * m 的矩阵,现在我会告诉你每一行和每一列的异或和请求出任意一种可能的矩阵 数据范围 1<=n,m<=100输入数据确保在int范围内 输入输出格式: 输入格式 ...

  9. 接口与DRF的安装

    接口 # 接口:url链接,通过向链接发送不同的类型请求与参数得到相应的响应数据​# 1.在视图层书写处理请求的 视图函数# 2.在路由层为视图函数配置 url链接 => 产生接口# 3.前台通 ...

  10. C#的WebApi 与 EasyUi的DataGrid结合生成的可分页界面

    1.从数据库每次取出的数据为当前分页的数据. 2.分页用的是EasyUI 的 Pagination控件,与DataGrid是相对独立的. 3.后台数据获取是通过WebApi去获取. 4.传入参数是:p ...