Consider the following:
sealed class MySealedClass(val guid: String = UUID.randomUUID().toString()) {
data class MyDataClass(var title: String) : MySealedClass()
data class MyDataClass2(var something: String) : MySealedClass()
}
val instance1 = MySealedClass.MyDataClass("hello")
val instance2 = MySealedClass.MyDataClass("hello")
Timber.i("instance1 guid: ${instance1.guid}")
Timber.i("instance2 guid: ${instance2.guid}")
Timber.i("are instances equal? ${instance1 == instance2}")
// Output:
instance1 guid: <removed>eb
instance2 guid: <removed>a6 // note that instance 2 GUID is different!
are instances equal? true // yet the instances are considered equal
Seems like the guid property from the parent class MySealedClass is not considered in the equals() method generated for the data classes. How can I make sure that it is considered? Is there any way without touching the generated equals() method?
Data classes in Kotlin use only properties listed in the primary constructor, when
equals/hashCode/toStringgenerated (see documentation). So, to include theguidinto generated methods implementation, pass it as a constructor parameter: