Неизменяемый интерфейс
Эта статья нуждается в дополнительных цитатах для проверки . ( январь 2018 г. ) |
В объектно-ориентированном программировании « неизменяемый интерфейс » — это шаблон проектирования неизменяемого объекта . [1] Шаблон неизменяемого интерфейса предполагает определение типа, который не предоставляет никаких методов , изменяющих состояние. Объекты, на которые ссылается этот тип, не имеют изменяемого состояния и кажутся неизменяемыми.
Пример
[ редактировать ]Ява
[ редактировать ]Рассмотрим класс 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); // a concrete instance of Point2D is referenced by the immutable interface
int x = point.getX(); // valid method call
int y = point.setX(42); // compile error: the method setX() does not exist on type ImmutablePoint2D
Ссылаясь только на неизменяемый интерфейс, нельзя вызывать метод, который изменяет состояние конкретного объекта.
Преимущества
[ редактировать ]- Четко сообщает неизменное намерение типа.
- В отличие от типов, реализующих шаблон Immutable Wrapper , ему не нужно «отменять» мутирующие методы, выдавая инструкцию « Нет операции » или выдавая исключение времени выполнения при вызове мутирующего метода.
Недостатки
[ редактировать ]- Экземпляры, на которые ссылается неизменяемый тип интерфейса, могут быть приведены к их конкретному изменяемому типу и изменено их состояние. Например:
public void mutate(ImmutablePoint2D point) { ((Point2D)point).setX(42); // this call is legal, since the type has // been converted to the mutable Point2D class }
- Конкретные классы должны явно заявить, что они реализуют неизменяемый интерфейс. Это может быть невозможно, если конкретный класс «принадлежит» стороннему коду, например, если он содержится в библиотеке.
- Объект на самом деле не является неизменяемым и, следовательно, не подходит для использования в структурах данных, основанных на неизменности, таких как хэш-карты. И объект может быть изменен одновременно с «изменяемой стороны».
- Некоторые оптимизации компилятора, доступные для неизменяемых объектов, могут быть недоступны для изменяемых объектов.
Альтернативы
[ редактировать ]Альтернативой неизменяемому шаблону интерфейса является неизменяемый шаблон-оболочка .
Постоянные структуры данных фактически неизменяемы, но при этом допускают изменение их представлений.
Ссылки
[ редактировать ]- ^ Неизменяемый интерфейс , c2.com
- неизменяемый , Mindprod.com
- Питер Хаггар, «Практическая практика Java 65: используйте наследование или делегирование для определения неизменяемых классов» , InformIT , 22 января 2001 г.