Search code examples
kotlinreflectionannotationsdata-class

Property include/exclude on Kotlin data classes


Suppose I only want one or two fields to be included in the generated equals and hashCode implementations (or perhaps exclude one or more fields). For a simple class, e.g.:

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

Groovy has this:

@EqualsAndHashCode(includes = 'id')

Lombok has this:

@EqualsAndHashCode(of = "id")

What is the idiomatic way of doing this in Kotlin?

My approach so far

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
   }
}

Just feels wrong though... I don't really want name to be mutable, and the extra constructor definition is ugly.


Solution

  • I've used this approach.

    data class Person(val id: String, val name: String) {
       override fun equals(other: Any?) = other is 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) 
    }