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

Yona Appletree

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

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

问题是,有时我会遇到Leaf该类的多个实例显然,这通常不应该发生,但是在使用某些框架和某些测试用例进行序列化和反序列化时会发生。

现在,您可能会争辩说我应该解决这些情况,但是很难知道它们可能在哪里,并且修改框架的反序列化语义并非总是可能或不希望的。

因此,我希望的所有实例都object充当相同的值,就像无参数data class(或case classScala中无参数)一样。

到目前为止,我最好的解决方案是在object我可能遇到的每个问题中创建以下解决方案

object SaneLeaf {
    override fun hashCode() = javaClass.hashCode()
    override fun equals(other: Any?) = other?.javaClass == javaClass
}

显然,这是冗长且容易出错的,因为似乎不可能将那些实现抽象为接口。在对象不需要扩展另一个类的情况下,超类将起作用,但通常并非如此。

另外,我可以创建一个带有Nothing参数的数据类但这似乎更像是骇客。

其他人如何处理这个问题?是否有计划按照这些类的假定语义向对象添加hashCodeequals实现(所有实例都应相等/相同的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

处理每个对象的多个选择的最佳方法

在多个对象之间共享对象实例的最佳方法是什么?

什么是处理多个对象而不撤回已处理对象的最佳方法?

Javascript:实例化对象数组的最佳方法

处理Redis中多个列表的最佳方法?

处理多个状态更改的最佳方法

处理多个SKScenes的最佳方法是什么?

处理多个JavaScript检查的最佳方法

处理多个NSURL连接的最佳方法

处理公共/中心对象的最佳方法

更好的处理多个jboss实例的方法

处理具有多个语义的多个常量的最佳方法

为了将多个对象添加到场景中,处理触摸动作的最佳方法是什么?

Salesforce-从对象层次结构中删除多个记录和Salesforce中的错误处理的最佳方法

基于字符串实例化对象的最佳方法

Rails“服务对象”最佳实践-类方法或实例化

用numba处理容器中多个常量的最佳方法?

处理在R中连接的多个表的最佳方法是什么?

在快速路线中处理多个功能/场景的最佳方法?

在NodeJS中处理多个http调用的最佳方法

什么是处理多个套接字连接的最佳方法

处理多个条件进行条件编译的最佳方法

处理JavaScript中相同属性的多个赋值的最佳方法

用angular处理多个项目的最佳方法是什么?

处理多个事件侦听器的最佳方法

“否定”实例的最佳方法

反应最佳方法来处理挂载前的空对象?

处理侦听并触发事件的元素/对象的最佳方法是什么?

在Rails表单对象中处理日期的最佳方法是什么