由于部分原因是我无法在Kotlin中创建没有参数的数据类,因此我object
在这些情况下使用s,例如
sealed class Node {
object Leaf : Node()
data class Branch(val left:Node, val right:Node) : Node()
}
问题是,有时我会遇到Leaf
该类的多个实例。显然,这通常不应该发生,但是在使用某些框架和某些测试用例进行序列化和反序列化时会发生。
现在,您可能会争辩说我应该解决这些情况,但是很难知道它们可能在哪里,并且修改框架的反序列化语义并非总是可能或不希望的。
因此,我希望的所有实例都object
充当相同的值,就像无参数data class
(或case class
Scala中无参数)一样。
到目前为止,我最好的解决方案是在object
我可能遇到的每个问题中创建以下解决方案:
object SaneLeaf {
override fun hashCode() = javaClass.hashCode()
override fun equals(other: Any?) = other?.javaClass == javaClass
}
显然,这是冗长且容易出错的,因为似乎不可能将那些实现抽象为接口。在对象不需要扩展另一个类的情况下,超类将起作用,但通常并非如此。
另外,我可以创建一个带有Nothing
参数的数据类。但这似乎更像是骇客。
其他人如何处理这个问题?是否有计划按照这些类的假定语义向对象添加hashCode
和equals
实现(所有实例都应相等/相同的hashCode)?
我相信拥有object
的基础类的多个实例确实是您应该解决的问题,但是有一种更简单的解决方法,可以让您拥有所描述的相等语义。
您可以定义一个执行相等逻辑的抽象类,并使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
将继承您的equals
实现SingletonEquality
并按照您想要的方式进行比较。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句