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

相关文章

来自专栏大前端_Web

javascript中的for in 和 in运算符

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

1072
来自专栏WD学习记录

js学习2016-8-16

    当一个函数被保存为对象的一个属性时,我们称它为一个方法。如果调用表达式包含一个提取属性的动作,(即我们讲解对象时所说的.操作符),那么它就被当做一个方法...

611
来自专栏柠檬先生

Python 基础 变量和数据类型

  python 数据类型       一,整数,可以出来任意大小的整数。 如 1, 100, -8080,0 等等。       二,浮点数,浮点数也可以被成...

2006
来自专栏PhpZendo

带你入门 JavaScript ES6 (三)

上一章我们学习了 for of 遍历和扩展字符语法。本章我们主要学习 ES6 中的箭头函数

442
来自专栏菩提树下的杨过

Javascript数组常用方法[包含MS AJAX.NET的prototype扩展方法]示例

看了JefferyZhao的MSDN web cast视频教程,亲自实践了一下,代码如下: <%@ Page Language="C#" AutoEvent...

1907
来自专栏青枫的专栏

Java中如何使用帮助文档(API)

  5:第一步:看包     java.lang包下的类不需要导入,其他的全部需要导入。     要导入:     java.util.Scanner

1192
来自专栏静默虚空的博客

[Java 基础]字符串

String类 实例化String对象 String 对象初始化方式有多种。 如下代码中,各种初始化方式的效果是一样的,初始化后,String 对象的内容为 "...

1665
来自专栏技术记录

java之自动过滤提交文本中的html代码script代码

public class test { public static String Html2Text(String inputString) { ...

1936
来自专栏deepcc

JavaScript 中的 replace 方法

3086
来自专栏吾爱乐享

java之学习泛型的概述和基本使用

1416

扫码关注云+社区