Kotlin中能否创建数组索引引用?避免重复调用函数赋值
Kotlin中数组元素引用的实现思路
首先明确:你设想的这种直接创建数组元素引用(像val r: Reference = arr[xxx]; r = 0)的写法在Kotlin里是做不到的。因为JVM平台本身不支持这种直接指向内存元素的低级引用操作,Kotlin也没有提供对应的语法糖来实现这种语法。
不过可以通过几种方式达到避免重复调用长函数的核心目的,贴合你想要的"引用"思路:
1. 最简洁:提前存储索引
这是最直接且高效的方案,本质是把长函数的计算结果(索引)存下来,后续直接使用该索引操作数组:
val arr = Array(20) { it } val index = some_very_long_function() arr[index] = 0 // 后续如果还要操作这个位置,直接用index即可,不用再调用函数
2. 模拟可读写的元素引用
如果想要更贴近"引用"的使用体验,可以自己实现一个简单的包装类,封装对数组元素的读写操作:
// 自定义可读写引用类 class MutableElementRef<T>( private val getValue: () -> T, private val setValue: (T) -> Unit ) { var value: T get() = getValue() set(newValue) = setValue(newValue) } // 使用示例 val arr = Array(20) { it } val index = some_very_long_function() val r = MutableElementRef( getValue = { arr[index] }, setValue = { arr[index] = it } ) r.value = 0 // 等效于 arr[index] = 0 println(r.value) // 读取该位置的当前值
这个类模拟了一个指向数组元素的"引用",通过r.value就能完成读写,不用重复写数组和索引的组合。
3. 利用标准库的原子引用(线程安全场景)
如果你的场景需要线程安全,可以直接用Kotlin标准库的AtomicReference,不过需要先把元素值取出来维护,修改后再写回数组:
import java.util.concurrent.atomic.AtomicReference val arr = Array(20) { it } val index = some_very_long_function() val r = AtomicReference(arr[index]) r.set(0) // 修改引用中的值 arr[index] = r.get() // 写回数组
这种方式适合多线程环境,但如果不需要线程安全,自定义包装类更轻量。
内容的提问来源于stack exchange,提问作者Henktorius
相关产品推荐
相关产品推荐

