当前位置: 首页 > 知识库问答 >
问题:

Kotlin数据类上的属性包括/排除

路奇
2023-03-14

假设我只希望在生成的equals和hashCode实现中包含一个或两个字段(或者排除一个或多个字段)。对于简单类,例如:

data class Person(val id: String, val name: String)

Groovy有以下特点:

@EqualsAndHashCode(includes = 'id')

龙目岛有:

@EqualsAndHashCode(of = "id")

静态编程语言中这样做的惯用方法是什么?

data class Person(val id: String) {
   // at least we can guarantee it is present at access time
   var name: String by Delegates.notNull()

   constructor(id: String, name: String): this(id) {
      this.name = name
   }
}

只是感觉不对。。。我真的不希望name是可变的,而且额外的构造函数定义很难看。

共有3个答案

吕宇定
2023-03-14

我也不知道Kotlin(1.1)中的“idomatic方式”如何做到这一点。。。

我最终覆盖了equalshashCode

data class Person(val id: String,
                  val name: String) {

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other?.javaClass != javaClass) return false

        other as Person

        if (id != other.id) return false

        return true
    }

    override fun hashCode(): Int {
        return id.hashCode()
    }
}

难道没有更好的方法吗?

左丘嘉言
2023-03-14

这种方法可能适用于财产排除:

class SkipProperty<T>(val property: T) {
  override fun equals(other: Any?) = true
  override fun hashCode() = 0
}

SkipProperty。equals仅返回true,这会导致父对象的equals中跳过嵌入的属性。

data class Person(
    val id: String, 
    val name: SkipProperty<String>
)

余阳秋
2023-03-14

我用过这种方法。

data class Person(val id: String, val name: String) {
   override fun equals(other: Person) = EssentialData(this) == EssentialData(other)
   override fun hashCode() = EssentialData(this).hashCode()
   override fun toString() = EssentialData(this).toString().replaceFirst("EssentialData", "Person")
}

private data class EssentialData(val id: String) {
   constructor(person: Person) : this(id = person.id) 
}
 类似资料:
  • 我正在为一些JSON建模,并使用以下几行代码 随着: 但是,请继续查看错误:。 你知道为什么吗? 仅供参考,JSON看起来像:

  • 我尝试在和中排序一个大小为100000000的数组,我可以看到它们之间存在巨大的性能差距。对于这个数字,几乎比快倍(在我的机器上)。 我记录了一些结果,发现当大小在10000左右或更小时,swift的速度更快,但一旦数值上升,就会变得比慢得多。 下面是Swift和Kotlin的代码, 迅捷 科特林 下面是两个记录的时间, 迅捷 因此,在这里,您可以看到在大小增加时变得极其缓慢,尽管在数量较小时它会

  • 从Kotlin开始,想要创建一个数据类

  • 如何避免对类的可选属性使用 我应该创建一个局部变量吗?我认为使用不是一个好的做法

  • 问题内容: 我正在尝试将一个对象呈现为json,包括嵌套的属性,并按created_at属性对其进行排序。 我正在使用代码执行此操作: 如何按created_at属性对呼叫进行排序? 问题答案: 如果您认为Rails是如何工作的,则调用只是与Call模型相关的一种方法。有几种方法可以做到这一点。一种是在关联上设置订单选项。一种是全局更改Call模型的默认范围,另一种是在Customer模型中创建一

  • 将属性包含到模型中意味着 EF 将获得该属性的元数据,并且将尝试从数据库读取该属性的值或将该属性的值写入到数据库。 惯例 按照惯例,具有 getter 和 setter 访问器的公共(public)属性将被包含在模型中。 数据注解 可以使用数据注解将属性从模型中排除。 public class Blog { public int BlogId { get; set; } publi