当前位置: 首页 > news >正文

Kotlin 异步初始化值

在一个类初始化的时候或者方法执行的时候,总有一些值是需要的但是不是立即需要的,并且在需要的时候需要阻塞流程来等待值的计算,这时候异步的形式创建这个值是毋庸置疑最好的选择。

为了更好的创建值需要使用 Kotlin 的协程来创建,因为协程足够轻量。那么要设置这个功能需要几个点

  1. 使用委托方式创建,这样可以和正常的使用计算结果的值一样使用
  2. 使用 kotlin 的协程异步进行创建
  3. 如果需要的时候值还未产生,需要等待结果产生
  4. 结果出现后,需要将值进行缓存,以便多次的方位该值
  5. 如果负责计算值的委托被赋值了新值,需要停止计算并将新值进行缓存
/*** 异步创建一个值,并在使用的时候等待其生产完成* 注意,不能生产空值* 例如:异步创建值,并在需要使用时等待其等待生产完成,如果已经生产完成就直接返回*/
class AsyncValue<T : Any>(dispatcher: CoroutineDispatcher = Dispatchers.Default,private val producer: suspend () -> T
) {private var result: T? = nullprivate var exception: Throwable? = nullprivate var finished = falseprivate val production: Deferred<T?> = async(dispatcher) {return@async invoke().apply {finished = trueresult = this}}private suspend fun invoke(): T? = try {producer()} catch (e: Exception) {exception = enull}operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {if (!finished) production.cancel()result = valuefinished = true}operator fun getValue(thisRef: Any?, property: KProperty<*>): T {exception?.let { throw it }return if (finished) {result ?: throw IllegalStateException("The value for ${property.name} is null")} else {runBlocking { await() }}}/*** 获取值,如果值还没有初始化完成就返回 null,或者出现异常了也返回 null*/fun getOrNull(): T? {return result}/*** 获取值,如果值还没有初始化则抛出异常,如果出现异常了也抛出异常*/fun getOrThrow(): T {exception?.let { throw it }return result ?: throw IllegalStateException("The value is null")}/*** 获取值,如果值不存在则等待初始化,如果出现异常了也抛出异常*/suspend fun getAwaitOrThrow(): T {exception?.let { throw it }return await()}/*** 获取值,如果值不存在则等待初始化,如果出现异常了就返回 null*/suspend fun getAwaitOrNull(): T? {return kotlin.runCatching { await() }.getOrNull()}private suspend fun await(): T {if (!finished) {production.await()}exception?.let { throw it }return result ?: throw IllegalStateException("The value is null")}
}

使用测试

val image: BufferedImage by AsyncValue {ImageIO.read(File("E:\\仓库\\study\\散图\\F0FadEKaEAAm9_m.jpg"))
}
// 其他逻辑
//...
// 使用异步创建的结果
println(image)

该程序例子是不能生产 Null 如果生产结果可能包含 Null 可以使用以下程序。否则直接返回 Null 会抛出异常

val optional: Optional<String> by AsyncValue {Optional.ofNullable(null)
}
http://www.dtcms.com/a/185398.html

相关文章:

  • P2P架构
  • 用 AltSnap 解锁 Windows 窗口管理的“魔法”
  • lua入门语法,包含安装,注释,变量,循环等
  • NY115NY121美光科技芯片NY122NY130
  • 添加购物车-02.代码开发
  • 讲讲git 和svn
  • VUE中通过DOM导出PDF
  • SET NX互斥功能的实现原理
  • 电商平台 WAF 防护终极指南
  • 云平台管理部署知识点——问题+答案
  • HTTP方法和状态码(Status Code)
  • 软考教材重点内容 信息安全工程师 第24章 工控安全需求分析与安全保护工程
  • Spring AI 与 Groq 的深度集成:解锁高效 AI 推理新体验
  • CTF实战秘籍:跨平台文件合并与数据重构技术
  • 用postman的时候如何区分服务器还是自己的问题?
  • PyTorch随机数控制全指南:从种子设置到状态管理
  • pclinuxos系统详解
  • AI 时代 UI 设计的未来范式
  • C++多态讲解
  • hive两个表不同数据类型字段关联引发的数据倾斜
  • Java设计模式之装饰器模式:从基础到高级的全面解析(万字解析)
  • Git的基本操作
  • hive在配置文件中添加了hive.metastore.uris之后进入hive输入命令报错
  • R语言实战第5章(1)
  • 前端面经 计网 http和https区别
  • SpringBoot校园失物招领信息平台
  • 24 小时 AI 门店管家:重新定义连锁门店智能化管理范式
  • 【氮化镓】横向GaN 器件注入隔离区的电场相关载流子传输特性
  • 棉花杂草检测数据集VOC+YOLO格式4279张2类别
  • LabVIEW中算法开发的系统化解决方案与优化