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 条评论
登录 后参与评论

相关文章

来自专栏java工会

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

a) 答:Java源文件被编译成字节码的形式,无论在什么系统环境下,只要有java虚

1111
来自专栏程序生活

Python中defaultdict用法

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

Python正则表达式初识(四)

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

652
来自专栏数据结构笔记

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

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

702
来自专栏Python小屋

Python标准库base64用法简介

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

6288
来自专栏JavaEE

探讨Java参数传递问题

可能很多人都知道参数有形参和实参之分,却不知道区别到底是什么;知道Java中内存分为栈、堆、方法区等5片内存,不知道每片内存中保存的都是什么;关于参数的传递到底...

962
来自专栏星汉技术

原 荐 Scala的面向对象

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

30213
来自专栏我爱编程

Day10面向对象高级编程1/3

使用slots 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。 class...

3235
来自专栏强仔仔

Java基础知识-if条件语句的使用介绍

这章节给大家介绍一下Java中经常使用的if条件语句是如何使用的和在项目开发过程中if语句的注意事项。 1.首先就是最基础的写法if(boolean类型) 和i...

2295
来自专栏黑泽君的专栏

接口中可以包含的组成部分

    1.接口中的抽象方法,修饰符如果自己写必须是:public abstract

4201

扫码关注云+社区