Chyba byłem tak podekscytowany spotkaniem java.util.Objects, że faktycznie rozum mi odjęło, żeby prezentować przykład, w którym zwykłe porównanie wystarczy (!) Kiedy pierwszy raz zobaczyłem komentarz Michała, nie wiedziałem, czy sobie żarty ze mnie robi, czy faktycznie całe piękno mojego przykładu poszło w zapomnienie. I stało się, po chwili wiedziałem, że owym przykładem mógłbym zrobić więcej krzywdy niż pomóc. Cóż, nadrabiam teraz wierząc, że co jak co, ale klasa java.util.Objects zapadnie już wszystkim w pamięci :)"Proponuje pozmieniać wszystkie Object.equals(a,b) na a==b lub a!=b (w zalezności od asercji).
Tak tak.. ten all-in-one-test za wiele nie pokazuje :)"
Czy poniższy przykład oddaje użyteczność klasy java.util.Objects w Java 7? Czy widomo, dlaczego poprzednio zwykłe porównanie przez równość wystarczyło? Chętnie wytłumaczę.
Metody hashCode() oraz equals(Object) wygenerowałem przy użyciu funkcji Generate hashCode() and equals()... w Eclipse.
package pl.japila.java7; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Objects; import org.junit.Test; public class ObjectsTest { class Customer { String name; public Customer(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + getOuterType().hashCode(); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Customer other = (Customer) obj; if (!getOuterType().equals(other.getOuterType())) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } private ObjectsTest getOuterType() { return ObjectsTest.this; } } @Test public void testObjectsMethods() { Customer jacek = new Customer("Jacek"); Customer klonJacka = new Customer("Jacek"); assertTrue("Klon Jacka jest Jackiem", Objects.equals(jacek, klonJacka)); assertFalse("Jacek nierówny swojemu klonowi", jacek == klonJacka); } }A dziękować wiemy komu. Najserdeczniejsze podziękowania Michał!
assertTrue(a == b) => assertSame(a, b)
OdpowiedzUsuńassertFalse(a == b) => assertNotSame(a, b)