当前位置: 首页 > 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.xdnf.cn/news/404911.html

相关文章:

  • JVM类加载
  • 生产环境怎么移除console
  • WebSocket集成方案对比
  • 中华春节符号全球推广委员会——“金文形意书《易经》成果展”研学之旅
  • 【Spark】使用Spark集群搭建Yarn模式
  • Docker-配置私有仓库(Harbor)
  • mapreduce-wordcount程序2
  • PostgreSQL 中的序列(Sequence)
  • 力扣HOT100之二叉树:226. 翻转二叉树
  • WSL-Ubuntu 中安装 Git LFS 记录
  • 网络编程epoll和udp
  • 华为防火墙配置与网络协议实战指南:从基础到高阶排查
  • 破局智算瓶颈:400G光模块如何重构AI时代的网络神经脉络
  • 大模型的实践应用41-天气预测与分析决策系统:Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法
  • RabbitMQ高并发秒杀、抢购系统、预约系统底层实现逻辑
  • ArcGIS+InVEST+RUSLE:水土流失模拟与流域管理的高效解决方案;水土保持专题地图制作
  • 《Python星球日记》 第63天:文本方向综合项目(新闻分类)
  • 危化品安全员职业发展方向的优劣对比
  • 人工智能时代:解锁职业新身份,从“认证师”到“工程师”的进阶之路
  • 图灵爬虫练习平台第九题js逆向
  • 电力系统静态安全因素与动态安全因素的区别及具体分类
  • matlab计算天线的近场和远场
  • ThreadLocal原理分析--结合Spring事务
  • 产品设计基石--用户体验要素--实战4
  • 【课题推荐】基于改进遗传算法的公交车调度排班优化研究与实现方案
  • PID与模糊PID系统设计——基于模糊PID的水下航行器运动控制研究Simulink仿真(包含设计报告)
  • 在Web应用中集成Google AI NLP服务的完整指南:从Dialogflow配置到高并发优化
  • Codeforces Round 1024 (Div. 2)(A-D)
  • 1.8 梯度
  • FanControl(电脑风扇转速控制软件) v224 中文版