Wenn Sie die Klassenäquivalenz in Java überprüfen möchten, müssen Sie equals ()
undhashCode ()
ordnungsgemäß implementieren [^ 1]. Normalerweise implementiere ich es nicht selbst, daher denke ich, dass es keinen Fehler gibt, aber ich mache mir Sorgen, es nicht zu testen.
Als ich nach einer effizienten Methode suchte, fand ich eine Bibliothek namens EqualsVerifier [].
Erste Schritte beschreibt die Einrichtung in Maven. Weitere Tools finden Sie unter Mvn Repository.
Beispielsweise gibt es die folgende Namensklasse. Die equals ()
undhashCode ()
werden automatisch von IntelliJ IDEA generiert.
import java.util.Objects;
public final class Name {
private final String name;
public Name of(String name) {
return new Name(name);
}
public Name(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Name name1 = (Name) o;
return Objects.equals(name, name1.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
Der Test hierfür ist wie folgt (mit JUnit 4.12.).
import nl.jqno.equalsverifier.EqualsVerifier;
import org.junit.Test;
import java.sql.Timestamp;
public final class EqualsVerifierTest {
@Test
public void test_name() {
EqualsVerifier.forClass(Name.class).verify();
}
}
Nur das. Es ist einfach.
Natürlich weiß ich nicht, ob ich es wirklich getestet habe, also teste ich es zum Beispiel mit der Klasse Timestamp [], die nicht dem allgemeinen Vertrag von equals ()
folgt.
EqualsVerifier.forClass(Timestamp.class).verify();
Ich habe den folgenden Fehler erhalten.
java.lang.AssertionError: Overloaded: More than one equals method found. Signature should be: public boolean equals(Object obj) For more information, go to: http://www.jqno.nl/equalsverifier/errormessages
Es befindet sich unter Felder ignorieren, kann jedoch beispielsweise ausgeschlossen werden: Einzelheiten finden Sie in der Dokumentation.
Ich denke, es ist besser, Transient für mich selbst zu verwenden.
Es steht am Ende von Warum, was, wie?, aber es ist ungefähr wie folgt. Es ist ein bisschen schwarze Magie.
equals ()
undhashCode ()
die erwarteten Ergebnisse für diese liefern.equals ()
, um sicherzustellen, dass Sie Überschreibungen anstelle von Überladungen verwenden.Ich fand es wichtig, eine gute Zeit zu haben (´ω`)
[^ 1]: Effektive Java 2nd Edition Siehe "Punkt 8 Befolgen Sie den allgemeinen Vertrag, wenn Sie Gleichheit überschreiben" und "Punkt 9 überschreiben Sie immer den Hashcode, wenn Sie Gleichheit überschreiben".
Recommended Posts