Неизменяемый объект
- 1 year ago
- 0
- 0
В объектно-ориентированном программировании , « неизменяемый Интерфейс » — это шаблон для проектирования неизменяемого объекта . Неизменяемый интерфейс включает в себя определение типа, который не предоставляет никаких методов , которые могут изменить состояние. Объекты, на которые ссылается этот тип, выглядят как неизменяемые.
Рассмотрим класс java , который представляет собой двухмерную точку.
public class Point2D {
private int x;
private int y;
public Point2D(int x, int y) { this.x = x; this.y = y; }
public int getX() { return this.x; }
public int getY() { return this.y; }
public void setX(int newX) { this.x = newX; }
public void setY(int newY) { this.y = newY; }
}
Класс Point2D является изменяемым: его состояние может быть изменено после создания, если вызвать один из методов-сеттеров (
setX()
или
setY()
).
Неизменяемый интерфейс для Point2D может быть определен как:
public interface ImmutablePoint2D {
public int getX();
public int getY();
}
Сделав Point2D реализующим ImmutablePoint2D, код клиента теперь может использовать тип, который не имеет изменяющих методов, и, таким образом, остается неизменяемым. Это демонстрируется в следующем примере:
ImmutablePoint2D point = new Point2D(0,0); // на конкретный экземпляр Point2D ссылается неизменяемый интерфейс
int х = point.getX(); // допустимый вызов метода
point.setX(42); // ошибка компиляции: метод setX() не существует в типе ImmutablePoint2D
Имея только неизменяемый интерфейс, невозможно вызвать метод, который изменяет состояние конкретного объекта.
public void mutate(ImmutablePoint2D point) {
((Point2D)point).setX(42); // допустимый вызов, поскольку
// аргумент point был приведен к типу Point2D
}
Альтернативой неизменяемому интерфейсу является шаблон .