2017-04-03 4 views
0

Ich habe eine Datenklasse in Kotlin, die eine Anzahl von Eigenschaften hat, von denen eine ID ist. Aber wenn ich tatsächlich compare Funktion im Code verwende, möchte ich diese ID Eigenschaft beim Vergleich ausschließen. Gibt es eine Möglichkeit, dies zu tun, außer die Funktion compare manuell zu kneten?Vergleichen Sie Datenklasse in Kotlin ohne ID

Antwort

1

Sie können die copy() function für eine Ihrer Datenklassenexemplare verwenden, um eine Kopie davon zu erstellen "einige seiner Eigenschaften zu ändern". z.B .:

data class User(val id: Long, val name: String) 

val a = User(1, "John") 
val b = User(2, "John") 

println(a == b) // false 
println(a.copy(id = b.id) == b) // true 

eine Kopie eines Ihrer Datenklasseninstanzen erstellen und die ID zu ändern die gleiche wie die andere Instanz, die Sie gegen ermöglicht effektiv vergleichen sein wollen, um diese Eigenschaft zu ignorieren.

Sie könnten auch beide Datenklassenexemplare kopieren und id auf einen gemeinsamen Wert setzen, aber wenn Sie nur einmalige Vergleiche durchführen, wäre dies ein unnötiger Aufruf an copy().

+1

Das sieht genau so aus, wie ich gesucht habe. Ich kann solche Vergleichsmethode in der Datenklasse selbst in 1 Zeile implementieren. Vielen Dank. – arslancharyev31

1

Eine Datenklasse erzeugt die equals Funktion auf die Eigenschaften (compare nicht erzeugt wird) basiert, die in dem primären Konstruktor deklariert sind, also wenn Sie wollen, dass es nicht die IDs zu vergleichen, finden Sie die ID Eigenschaft heraus bewegen müssen des primären Konstruktors.

Der offensichtliche Teil ist, dass Sie die Eigenschaft in den Rumpf der Klasse verschieben müssen, aber dann müssen Sie es auch eine var machen, da es nicht im primären Konstruktor initialisiert wird (Sie können nicht Sei es ein val und initialisiere es auf einen Standardwert im init Block, denn dann kannst du es im sekundären Konstruktor nicht zuweisen).

ein Beispiel, wie Sie dies tun können:

data class User(val id: Long, val name: String) 

data class ModifiedUser(val name: String) { 

    var id: Long = 0 

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

} 

val u1 = User(1, "John") 
val u2 = User(2, "John") 

println(u1 == u2) // false 

val m1 = ModifiedUser(1, "Sally") 
val m2 = ModifiedUser(2, "Sally") 

println(m1 == m2) // true 

Es ist an Ihnen besser, welchen Weg zu Ihnen passt zu entscheiden, aber es ist vielleicht am einfachsten nur equals (and by implication, hashCode) außer Kraft zu setzen, das gewünschte Ergebnis zu erhalten, bei Zumindest enthält es den Code, der damit nur einmal in Verbindung steht, während die obige Lösung Ihre Klasse ziemlich kompliziert machen kann.

+0

Wow, all das nicht 'equals' zu schreiben? – voddan

Verwandte Themen