Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kotlin中的延迟属性(lazy properties)

Kotlin中的延迟属性(lazy properties)

作者头像
deep_sadness
发布于 2018-08-30 03:00:29
发布于 2018-08-30 03:00:29
3.5K00
代码可运行
举报
文章被收录于专栏:Flutter入门Flutter入门
运行总次数:0
代码可运行

属于Kotlin中的委托属性这一章中的标准委托

延迟属性Lazy

lazy() 是接受一个lambda 并返回一个 Lazy <T> 实例的函数,返回的实例可以作为实现延迟属性的委托。也就是说: 第一次调用get() 会执行已传递给 lazy() 的 lambda 表达式并记录结果, 后续调用get() 只是返回记录的结果。

这里需要注意的是 调用的是 get()方法,和set没啥关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val lazyValue: String by lazy {
    println("computed!")
    "Hello"
}

fun main(args: Array<String>) {
    println(lazyValue)
    println(lazyValue)
}

输出结果为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
computed!
Hello
Hello

同步锁模式

防止对个线程同时初始化

默认情况下,对于 lazy 属性的求值是同步锁的(synchronized):该值只在一个线程中计算,并且所有线程会看到相同的值。如果初始化委托的同步锁不是必需的,这样多个线程可以同时执行,那么将 LazyThreadSafetyMode.PUBLICATION 作为参数传递给 lazy() 函数。 而如果你确定初始化将总是发生在单个线程,那么你可以使用 LazyThreadSafetyMode.NONE模式, 它不会有任何线程安全的保证和相关的开销。

延迟属性Lazy 与 lateinit 区别

以下是lateinit var和by lazy { ... }委托属性之间的显著差异:

  • lazy { ... }代表只能用于val属性,而lateinit只能用于var,因为它不能编译到final字段,因此不能保证不变性;
  • lateinit var具有存储值的后备字段(backing field),而by lazy { ... }创建一个委托对象,其中存储一次计算的值,将对代理实例的引用存储在类对象中,并为与委托实例一起使用的属性生成getter。
  • 除了val之外,lateinit不能用于可空属性和Java原语类型(这是因为null用于未初始化的值);所以如果你需要在类中存在的支持字段,请使用lateinit; lateinit var可以从对象被看到的任何地方被初始化。从一个框架代码的内部,多个初始化方案是可能的单一类的不同对象。 by lazy { ... }反过来又定义了属性的唯一初始化器,只能通过覆盖子类中的属性进行更改。如果您希望以预先未知的方式从外部初始化属性,请使用lateinit。
  • 另外,还有一个方法没有提到Delegates.notNull(),它适用于non-null属性的延迟初始化,包括Java原始类型的属性。
延迟属性Lazy 与 lateinit 使用总结

lateinit用于外部初始化:当需要外部资料通过调用方法初始化您的值时。 例如通过调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private lateinit var value: MyClass

fun init(externalProperties: Any) {
   value = somethingThatDependsOn(externalProperties)
}

lazy当它只使用对象内部的依赖关系时。 嗯。静态变量的初始化挺适合这种方式的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.08.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
在Kotlin中,by lazy 和 lateinit 都是用于延迟初始化的手段,但它们各自有不同的用法和特点。下面详细讨论它们的作用和区别。
AntDream
2024/07/22
3010
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
从源码角度分析 Kotlin by lazy 的实现
延迟属性(lazy properties) 是 Kotlin 标准库中的标准委托之一,可以通过 by lazy 来实现。
fengzhizi715
2019/03/08
1.6K0
Kotlin下的5种单例模式
作者:AndyandJennifer 链接:https://www.jianshu.com/p/5797b3d0ebd0 著作权归作者所有,欢迎投稿 前言 最近在学习Kotlin这门语言,在项目开发中,运用到了单例模式。因为其表达方式与Java是不同的。所以对不同单例模式的实现进行了分别探讨。主要单例模式实现如下: 饿汉式 懒汉式 线程安全的懒汉式 双重校验锁式 静态内部类式 PS:该篇文章不讨论单例模式的运用场景与各种模式下的单例模式的优缺点。只讨论在Java下不同单例模式下的对应Kotlin实现。 一
用户1269200
2018/06/22
1.5K0
Kotlin Vocabulary | Kotlin 内建代理
代理可以帮助您将任务委托给其他对象,从而带来更佳的代码复用性,您可以从 我们之前的文章 了解到更多信息。Kotlin 不仅可以让您通过 by 关键字轻松实现代理,还在标准库中提供了像 lazy()、observable()、vetoable() 以及 notNull() 这样的内建代理。接下来就让我们开始了解这些内建代理的使用,以及其内部的实现原理。
Android 开发者
2022/03/09
1K0
设计模式-单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。
Anymarvel
2018/10/22
4130
Kotlin | 关于 Lazy ,你应该了解的这些事
本文主要分享 Kotlin Lazy 相关,希望看完本篇,可以帮助到你更好的理解与使用。
Petterp
2022/05/11
1.5K0
Kotlin | 关于 Lazy ,你应该了解的这些事
Kotlin的委托属性和区间
委托属性 委托属性 是一种通过委托实现拥有 getter 和可选 setter 的 属性,并允许实现可复用的自定义属性。例如: class Example { var p: String by Delegate() } 委托对象必须实现一个拥有 getValue() 方法的操作符,以及 setValue() 方法来实现读/写属性。些方法将会接受包含对象实例以及属性元数据作为额外参数。当一个类声明委托属性时,编译器生成的代码会和如下 Java 代码相似。 public final class Exam
xiangzhihong
2018/02/06
1.4K0
Better Kotlin
转眼间使用 Kotlin 已经有两个月了,时间不长,我也算搭上了 Google 宣布 Kotlin 作为官方支持语言的一波末班车。可能大家早已从纯 Java 开发 Android 转为了混合使用开发甚至是 Kotlin 开发,那你转向 Kotlin 的初衷又是什么呢?
贺biubiu
2019/04/24
1.3K0
Kotlin的延迟初始化: lateinit var和by lazy
可是有的时候,我并不想声明一个类型可空的对象,而且我也没办法在对象一声明的时候就为它初始化,那么这时就需要用到Kotlin提供的延迟初始化。Kotlin中有两种延迟初始化的方式。一种是lateinit var,一种是by lazy。
用户2436820
2019/03/19
3.4K0
Kotlin委托
Kotlin中有委托,这个C#中也有,不过对于学Java的童鞋来说,这是什么鬼啊,到底是干什么用的… 在委托模式中,当有两个对象参与处理同一个请求是,接受请求的对象将请求委托给另一个对象来处理。委托模式已证明是实现继承的一个很好的替代方式。Kotlin中委托分为类委托和委托属性,Kotlin官方库也封装了一些常用的委托。
haifeiWu
2018/09/11
1.5K0
Kotlin中单利常用的五种写法
单利模式是写代码过程中不可避免用到的,下面我总结一下单利常用的五种写法,话不多说了,来一起看看详细的介绍吧
PHP开发工程师
2021/06/02
5230
详细的双语言(Java与Kotlin)5种单例模式
博客:https://www.jianshu.com/u/0438038fe17e
陈宇明
2020/12/15
6140
详细的双语言(Java与Kotlin)5种单例模式
C# Lazy
Lazy<T> 是一个类,用于实现懒加载(Lazy Initialization)。懒加载是指对象的创建被推迟,直到第一次被使用时。Lazy<T> 允许你在第一次访问对象时进行初始化,这对于大型或资源密集型对象的性能优化非常有用。你可以通过提供一个委托(Delegate)来延迟初始化对象,Lazy<T> 确保所有线程使用同一个懒加载对象的实例,并且丢弃未使用的实例,从而优化内存使用。
JusterZhu
2023/10/06
3470
C# Lazy
Kotlin基础之委托
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 类委托 委托模式是替换继承的较好的设计模式,Kotlin天生支持委托模式,无须任何模板代码。类Derived可以继承Base接口,委托所有public方法给指定对象。例如: interface Base { fun print() } class BaseImpl(val x: Int) : Base { override fun print() { print
xiangzhihong
2018/02/08
8510
Kotlin|这些隐藏的内存陷阱,你应该熟记于心
Kotlin 是一个非常 yes 的语言,从 null安全 ,支持 方法扩展 与 属性扩展,到 内联方法、内联类 等,使用Kotlin变得越来越简单舒服。但编程从来不是一件简单的工作,所有简洁都是建立在复杂的底层实现上。那些看似简单的kt代码,内部往往隐藏着不容忽视的内存开销。
Petterp
2022/12/07
8700
Kotlin|这些隐藏的内存陷阱,你应该熟记于心
单例模式-温故而知新
java和kotlin的实现方式?懒汉饿汉到底啥意思? 饿汉、双重校验、静态内部类模式的分别实现原理? 其中涉及到的类初始化、类锁、线程安全、kotlin语法知识?
码上积木
2021/03/24
5390
Kotlin委托的深入解析与实践
在Kotlin编程语言中,委托是一项强大的特性,它能够极大地简化代码,提高代码的可维护性。本文将深入探讨Kotlin中的委托机制,介绍其原理、具体使用方式以及实际应用场景。
Rouse
2023/11/15
3040
Kotlin委托的深入解析与实践
【Kotlin】类的初始化 ④ ( lateinit 延迟初始化 | ::属性名称.isInitialized 检查属性是否初始化 | lazy 惰性初始化 )
在定义属性时 , 可以使用 lateinit 关键字 设置该属性的 延迟初始化 , 在 实例对象 创建时不进行初始化 , 在使用该属性之前对其进行初始化即可 ;
韩曙亮
2023/03/30
1.8K0
《Kotin 极简教程》第7章 面向对象编程(OOP)(2)《Kotlin极简教程》正式上架:
在上面的代码中,我们通过向注解类添加元注解(meta-annotation)的方法来指定其他属性:
一个会写诗的程序员
2018/08/17
1.6K0
Kotlin基本语法和使用技巧
take是从集合中取前几个元素 takeLast是从集合中取后几个元素 sortedBy 排序 过滤list,符合过滤条件的就是过滤结果 filterNot把符合条件的过滤掉,剩下的是结果。这个操作和 filter 相反 slice,取集合中的某一部分
六月的雨
2020/03/27
8970
相关推荐
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验