我有一个定制的lazy实现,它允许指定一个键函数,然后在每次属性访问时调用该函数,如果它的返回值不等于最后一个返回值,则再次调用初始化器.

那么,有没有什么简单明了的东西可以指定为键函数,以便让实现判断特定变量x是否包含对另一个对象的引用?某一物体独一无二的价值?

var x = MyClass()

val myValue by lazy(key = x::IDENTIFIER) { ... }

否则,我将不得不让我的自定义实现接受(KeyType, KeyType) -> Boolean函数,这样我就可以让它使用引用相等运算符.

推荐答案

听起来您可以编写包装任何类的包装器.该包装器的equals将使用===来比较包装的值.

class Identity<T>(val value: T) {
    
    override fun hashCode(): Int = value?.hashCode() ?: 0 // or use System.identityHashCode()
    
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as Identity<*>

        return value === other.value
    }
}

那么关键函数可以只有{ x: SomeType -> Identity(x) }.它将为===相等的两个x创建两个==相等的Identity对象.

Kotlin相关问答推荐

Jetpack Compose Material3和Material2 Slider onValueChangeFinded()的行为不同

Kotlin-stdlib中的模拟扩展函数

Kotlin接口方法默认值&;可传递依赖项

如何从 Period.between() 返回的字符串中提取信息? (Kotlin )

TzdbZoneRulesProvider 在 java.time 中不工作

MyType.()在 Kotlin 中是什么意思?

Kotlin 协程按顺序执行,但仅在生产机器上执行

如何在 jOOQ 中两次加入同一张表?

compareBy 如何使用布尔表达式在 kotlin 中工作

内联函数导致单元测试代码覆盖率报告出错

使用 Hilt 注入 CoroutineWorker

下拉通知面板时是否可以暂停Android中的任何视频(媒体播放器)应用程序?

Kotlin 中的数据类

Kotlin协程处理错误和实现

Kotlin 扩展函数 - 覆盖现有方法

如何在kotlin语言中将字符转换为ascii值

我们如何在Java注释声明中引用Kotlin常量?

Kotlin中的Memoization功能

android Room 将 Null 作为非 Null 类型返回

旋转 kotlin 数组