SPRING-SOURCE.RU

Налаживание идентичности POJO

Идентичность Java объектов определяется с помощью equals() и hashCode() методы. Иногда, в зависимости от приложения, требуется переопределить эти методы. PIX система это как раз то самое приложение.

Для выполнения кода POJO вы должны заменить поведение методов equals() и hashCode(). Если вы не заменяете эти методы, то реализация по умолчанию для equals() использует бинарное сравнение эквивалентное следующему коду:

                        
public boolean equals(Object obj) {
	return (this == obj);
}
		

Почему Java платформа по умолчанию не адекватна

Реализация по умолчанию для hashCode() использует System.identityHashcode() метод для получения хэш кода. Этот метод возвращает хэш связанный с адресом памяти, где расположен объект. Конечный эффект использования стандартного выполнения equals() и hashCode() – это, то, что два объекта равны только тогда, когда они являются одним и тем же Java объектом. Для некоторых приложений это нормально, но не для нашего, чаще всего, это является проблемой.

Пользовательские equals() и hashCode() методы необходимы, потому что объекты такие как PixUser могут быть сохранены и извлечены из базы данных. Если вы сравните экземпляр PixUser, созданного при помощи своего конструктора с другим экземпляром, извлеченным из базы данных, то вы захотите чтобы они были равны, если все их значения имеют равные значения. PixUser считается равным нашим приложением если его или ее имя, email, фамилия, имя пользователя и пароль равны. Вам не нужно чтобы они были одинаковыми Java объектами.

Давайте попробуем

Выполнение идентификации POJO

PixUser может быть загружен из и записан в базу данных и два совершенно разных экземпляра Java объекта, считаются равными, если PixUser содержит те же значения в полях данных.

1. Реализуйте метод равенства для PixUser, как показано в нижнем фрагменте кода (этот код можно найти в PixUser.java):

                        
public boolean equals(Object obj) {
  if (this == obj)
      return true;
  if (obj == null)
      return false;
  if (getClass() != obj.getClass())
      return false;
  final PixUser other = (PixUser) obj;
  if (email == null) {
      if (other.email != null)
          return false;
  } else if (!email.equals(other.email))
      return false;
  if (firstName == null) {
      if (other.firstName != null)
          return false;
  } else if (!firstName.equals(other.firstName))
      return false;
  if (lastName == null) {
      if (other.lastName != null)
          return false;
  } else if (!lastName.equals(other.lastName))
      return false;
  if (password == null) {
      if (other.password != null)
          return false;
  } else if (!password.equals(other.password))
      return false;
  if (userName == null) {
      if (other.userName != null)
          return false;
  } else if (!userName.equals(other.userName))
      return false;
  return true;
}
		

2. Используйте hashCode() для коллекций

                        
public int hashCode() {
        final int PRIME = 31;
        int result = 1;
        result = PRIME * result + ((email == null) ? 0 : email.hashCode());
        result = PRIME * result
                + ((firstName == null) ? 0 : firstName.hashCode());
        result = PRIME * result
                + ((lastName == null) ? 0 : lastName.hashCode());
        result = PRIME * result
                + ((password == null) ? 0 : password.hashCode());
        result = PRIME * result
                + ((userName == null) ? 0 : userName.hashCode());
        return result;
    }
		

Как это работает

Мы реализовали сравнение PixUser equals метод. Сравниваем следующие атрибуты POJO:

Если одно из значений не равно в одном из POJO, они считаются не равными. Равными считаются только тогда, когда все четыре перечисленных свойства равны.

Отметим, что список альбомов и комментариев у PixUser класса, не используются для определения равенства в equal() методе. Не используется так как эти списки динамические.

При помощи метода hashCode() вы сможете рассчитать хэш код для PixUser. Используя эту технику, вы можете быть уверены, что два рассматриваемых объекта являются равными, только если все члены экземпляров равны.

Выводы

Spring позволяет вам создавать приложения начиная с написания POJOs. На самом деле Spring позволит вам сохранить код POJO в ходе цикла разработки. Можно извлечь много выгод из того, что код POJO остается простым, включая следующие: