Kotlin —  lateinit vs lazy

Kotlin属性初始化

如果不想在一开始就初始化一个属性,那么你可以使用下面两个关键字。 ① lateinit ② lazy

lateinit

lateinit的意思是后面再初始化。

通常情况下,声明为非null类型的属性必须先初始化。但是,这在有些时候不是很方便。

要处理这种情况,可以使用lateinit修饰符修饰属性。

例如:

public class Main{
    lateinit var user:User
    
    fun init(){
        user=User()
    }

    fun do(){
      user.eat()
    }
    
}

a、lateinit只能用于var声明的类变量,并且属性没有自定义getter或setter方法。 b、属性的类型必须是非空的,并且不能是原始类型。

lazy

lazy的意思是惰性初始化。

lazy()是一个函数,它接受一个lambda并返回一个lazy实例,它可以作为一个实现lazy属性的委托:get()的第一个调用执行传递给lazy()的lambda并记录结果,随后调用get()只返回记录的结果。

例如:

public class User{
  val name:String by lazy {"Android Coder"}
}

因此第一次调用和之后调用,name都会返回“Android Coder

咱们该如何去选择使用它们呢? ① lateinit var 可以从任何你能看到对象的地方初始化。如果你想你的属性从外部被初始化,这时候可以使用lateinit。 ② lazy只能用于val属性,而lateinit只能应用于变量。因为它不能应用于final(val)字段,因此不能保证不可变性。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏星汉技术

原 荐 Scala的面向对象

----------目录--------------------------------------------------------- 1.Scala简介和...

30813
来自专栏数据结构笔记

数据结构(四):栈的应用之表达式求值

用户从控制台输入一个数学表达式(所有输入均合法),数学表达式只包含四则运算,程序需输出表达式对应的结果,如:

1012
来自专栏Python小屋

Python标准库base64用法简介

base64模块提供了大量函数用来把二进制数据编码为可打印的ASCII字符,以及将其解码为二进制数据。提供了RFC3548中Base16、Base32、Base...

8278
来自专栏java工会

Java基础第一阶段知识点,招实习的面试官都在问这些

2239
来自专栏西安-晁州

js数组去重

对于如下对象数组 [{id: 0, name: "name1"}, {id: 1, name: "name2"},{id: 1, name: "name2"},...

2680
来自专栏Spark学习技巧

scala中常用但其他语言不常见的符号含义 - 心灵空谷幽兰 - 博客园

本文旨在介绍Scala在其他语言中不太常见的符号含义,帮助理解Scala Code。 随着我对Scala学习的深入,我会不断增加该篇博文的内容。 修改记录 -...

2056
来自专栏转载gongluck的CSDN博客

c语言中函数参数处理顺序-从右向左

c语言中函数参数处理顺序-从右向左      下面我们来看2个案例,分析下c语言中函数参数处理顺序。      第一个: #include "stdio....

4296
来自专栏Java帮帮-微信公众号-技术文章全总结

04.Java对象和类

04.Java对象和类 Java 对象和类 Java作为一种面向对象语言。支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研...

4586
来自专栏fangyangcoder

C++学习笔记——大杂烩

                                                        by方阳

1052
来自专栏Python爬虫与数据挖掘

Python正则表达式初识(四)

今天继续给大家分享Python正则表达式基础知识,主要给大家介绍一下特殊字符“{}”的用法,具体的教程如下。

762

扫码关注云+社区

领取腾讯云代金券