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)