Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 处理多个对象实例的最佳方法_Kotlin_Data Class - Fatal编程技术网

Kotlin 处理多个对象实例的最佳方法

Kotlin 处理多个对象实例的最佳方法,kotlin,data-class,Kotlin,Data Class,部分原因是我无法在Kotlin中创建没有参数的数据类,我在这些情况下使用objects,例如 sealed class Node { object Leaf : Node() data class Branch(val left:Node, val right:Node) : Node() } 问题是,有时,我会得到Leaf类的多个实例。显然,这通常不应该发生,但在使用某些框架和测试用例序列化和反序列化时会发生 现在,您可能会认为我应该修复这些情况,但很难知道它们可能在哪里,而且修改框

部分原因是我无法在Kotlin中创建没有参数的数据类,我在这些情况下使用
object
s,例如

sealed class Node {
  object Leaf : Node()
  data class Branch(val left:Node, val right:Node) : Node()
}
问题是,有时,我会得到
Leaf
类的多个实例。显然,这通常不应该发生,但在使用某些框架和测试用例序列化和反序列化时会发生

现在,您可能会认为我应该修复这些情况,但很难知道它们可能在哪里,而且修改框架的反序列化语义并不总是可能的或可取的

因此,我希望我的
对象
的所有实例充当相同的值,就像无参数
数据类
一样(或者Scala中的无参数
案例类

到目前为止,我的最佳解决方案是以下内容,包括在我创建的每个可能遇到此问题的
对象中:

object SaneLeaf {
    override fun hashCode() = javaClass.hashCode()
    override fun equals(other: Any?) = other?.javaClass == javaClass
}
显然,这是冗长且容易出错的,因为似乎不可能将这些实现抽象到接口中。在对象不需要扩展另一个类的情况下,可以使用超类,但通常情况并非如此

或者,我可以创建一个带有
Nothing
参数的数据类。但这似乎更像是一种黑客行为


其他人是如何处理这个问题的?是否有计划向遵循这些类的假定语义的对象添加
hashCode
equals
实现(所有实例都应该是相等的/相同的hashCode)?

我认为拥有一个
对象的基础类的多个实例确实是一个您应该解决的问题,但是有一个更简单的解决方法,允许您使用所描述的相等语义

您可以定义一个执行相等逻辑的抽象类,并使
sealed
类继承自它,如下所示:

abstract class SingletonEquality {
    override fun equals(other: Any?): Boolean =
        this::class.objectInstance != null && other?.javaClass == this.javaClass || 
        super.equals(other)

    override fun hashCode(): Int = 
        if (this::class.objectInstance != null) 
            javaClass.hashCode() else 
            super.hashCode()
}
以及用法:

sealed class Node : SingletonEquality() {
    object Leaf : Node()
    data class Branch(val left:Node, val right:Node) : Node()
}

在这里,
Leaf
将继承
SingletonEquality
equals
实现,并以您想要的方式进行比较。

您能想象当有两个或更多个单例时的情况吗?@ViktorYakunin,OP说:
我最终得到了Leaf类的多个实例。
,似乎是在序列化和反序列化之后。这是一个非常有趣的话题,想看看它的实际效果:)@ViktorYakunin,这里有一个演示:谢谢这个。。。我没有想到hashCode/equals会被数据类覆盖。如果有,我也希望看到更“正式”的讨论。否则,也许我应该开一张KT票?