01 listopada 2011

java.util.Objects w Java 7 jeszcze raz - ostatni?

Sądziłem, że poprzednie dwa wpisy na temat java.util.Objects wyczerpały temat, ale nie tylko, że nie wykorzystałem wszystkich metod oferowanych przez tę klasę, chociażby Objects.hash(Object... values), ale sprowokowany przez komentarz ags (znany również jako Andrzej Grzesik) udało mi się znacznie uatrakcyjnić mój przykład.

Zwracam uwagę na zmiany w samej klasie Customer - metody hashCode() oraz equals(Object) oraz sam test z assertNotSame() i assertSame().

Ufam, że teraz wszyscy są usatysfakcjonowani, nieprawdaż?

package pl.japila.java7;

import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

import java.util.Objects;

import org.junit.Test;

public class ObjectsTest {

 class Customer {
  public final String code;
  public final String name;

  public Customer(final String name, final String code) {
   this.name = name;
   this.code = code;
  }

  @Override
  public int hashCode() {
   return Objects.hash(name, code);
  }

  @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;
   return Objects.equals(name, other.name) && Objects.equals(code, other.code);
  }

  private ObjectsTest getOuterType() {
   return ObjectsTest.this;
  }
 }

 @Test
 public void testObjectsMethods() {

  Customer jacek = new Customer("Jacek", "X23");
  Customer klonJacka = new Customer("Jacek", "X23");

  assertTrue("Klon Jacka jest Jackiem", Objects.equals(jacek, klonJacka));
  assertNotSame("Jacek nierówny swojemu klonowi", jacek, klonJacka);
  
  Customer wskazanieNaJacka = jacek;

  assertTrue(Objects.equals(jacek, wskazanieNaJacka));
  assertSame(jacek, wskazanieNaJacka);
 }

}