Кофе-брейк #189. Паттерн проектирования Factory на примере. Методы equal() и hashcode() в Java

Статья из группы Random

Паттерн проектирования Factory на примере

Источник: Medium Представленное здесь руководство объясняет предназначение паттерна проектирования Factory на конкретном примере кода Java. Кофе-брейк #189. Паттерн проектирования Factory на примере. Методы equal() и hashcode() в Java - 1Что такое шаблон (паттерн) проектирования Factory и когда его нужно использовать? Давайте разберемся на примере. По своему опыту в разработке программного обеспечения, если я попытаюсь обобщить, какой шаблон проектирования чаще всего мною использовался, то Factory (фабричный) шаблон войдет в тройку лучших. Когда дело доходит до шаблонов Singleton или Builder, многие библиотеки предоставляют функциональность с помощью аннотаций. Тогда как фабричный шаблон проектирования — единственный, который вы должны реализовать самостоятельно. Лучше всего понять это можно постановкой задачи на примере. Вот ситуация, когда вам нужно создать службу бронирования номеров в отеле, где есть три типа номеров: обычный номер, номер делюкс и виллы. Исходя из требований заказчика вы должны создать объект в своей программе. Как мы видим, все три объекта должны расширять один и тот же интерфейс/класс, поскольку они имеют одинаковую функциональность. Итак, создадим интерфейс/класс Room.

class Room {
  public string getRoomId();
  public float getPrice();
}
Теперь сделаем три класса для каждого типа комнаты.

class NormalRoom extends Room {
  private string roomType;
  private string roomId;
  private float price;
}

class DeluxeRoom extends Room {
  private string roomType;
  private string roomId;
  private float price;
}

class Villa extends Room {
  private string roomType;
  private string roomId;
  private float price;
}
Я не добавляю дополнительные функции в класс, поэтому мы можем сосредоточиться на шаблоне проектирования. Теперь создадим класс для создания объектов комнат по требованию заказчика. Имя этого класса RoomFactory. Сначала посмотрите код, затем я поясню.

class RoomFactory {
  public static Room getRoom(String roomType) {
    switch(roomType){
      case 'Normal':
        return new NormalRoom();
      case 'Deluxe':
        return new DeluxRoom();
      case 'Villa':
        return new Villa();
    }
  } 
}
Это и есть фабричный класс, и я чувствую, что код многое объясняет сам по себе. Здесь у нас есть статический метод, и это единственный метод в этом классе, который принимает на входе строку и в соответствии с ней возвращает объект Room. Теперь любая библиотека использует этот класс и создает объект для комнаты.

Методы equal() и hashcode() в Java

Источник: Medium Благодаря этой публикации вы узнаете о работе методов equal() и hashcode(), а также о способе их переопределения в коде Java. Метод equals() в Java используется для определения равенства двух объектов. Он принадлежит к классу Object, являющемся корнем иерархии классов Java, и наследуется всеми классами Java. Метод equals() принимает объект в качестве аргумента и возвращает логическое значение, указывающее, равен ли этот объект вызываемому объекту. Метод hashCode() используется для возврата значения хеш-кода для объекта. Хэш-код — это числовое значение, которое используется для идентификации объекта в структуре данных на основе хэшей, такой как хэш-таблица. Метод hashCode() также определен в классе Object и наследуется всеми классами Java. Важно переопределить методы equals() и hashCode(), если вы хотите использовать свои собственные объекты в качестве ключей в структуре данных на основе хэшей, например в файле HashMap. Если вы переопределяете метод equals(), вы также должны переопределить и метод hashCode(), потому что метод hashCode() используется для определения местоположения объекта в структуре данных на основе хэша. И если два объекта равны, то они должны иметь одинаковый хеш-код. Вот пример того, как переопределить equals() и hashCode() в классе Java:

public class Employee {
    private String name;
    private int age;

    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) return true;
        if (!(o instanceof Employee)) return false;
        Employee e = (Employee) o;
        return e.name.equals(name) && e.age == age;
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + age;
        return result;
    }
}
В данном примере метод equals() сравнивает имя и возраст двух объектов Employee и возвращает значение true, если они равны. Метод hashCode() возвращает значение хэш-кода для объекта Employee на основе его имени и возраста. А теперь пример того, как вы можете использовать методы equals() и hashCode() в своем коде:

Employee e1 = new Employee("John", 30);
Employee e2 = new Employee("John", 30);

// e1 и e2 равны, поэтому будет напечатано "true"
System.out.println(e1.equals(e2));

// e1 и e2 имеют одинаковый хеш-код, поэтому будет напечатано "true"
System.out.println(e1.hashCode() == e2.hashCode());

// Создаем HashMap и добавляем e1 и e2 в качестве ключей
Map<Employee, String> map = new HashMap<>();
map.put(e1, "Employee 1");
map.put(e2, "Employee 2");

// HashMap считает e1 и e2 равными, поэтому будет напечатано "Employee 1"
System.out.println(map.get(e2));
В показанном выше примере кода метод equals() используется для сравнения двух объектов Employeee1 и e2, а метод hashCode() применяется для добавления их в качестве ключей к HashMap. Так как метод equals() считает e1 и e2 считается равными друг другу, он рассматривает их как один и тот же ключ и возвращает значение "Employee 1", когда e2 используется для поиска значения на карте.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ