Неизменяемый интерфейс - Immutable interface

В объектно-ориентированного программирования, "неизменный интерфейс" это шаблон для разработки неизменный объект.[1] Неизменяемый шаблон интерфейса включает определение типа, который не предоставляет никаких методы которые мутируют состояние. Объекты, на которые ссылается этот тип, не имеют изменяемого состояния и кажутся неизменяемыми.

Пример

Ява

Рассмотрим Java-класс, представляющий двумерную точку.

общественный учебный класс Point2D {    частный int Икс;    частный int у;    общественный Point2D(int Икс, int у) { это.Икс = Икс; это.у = у; }    общественный int getX() { возвращаться это.Икс; }    общественный int GetY() { возвращаться это.у; }    общественный пустота setX(int newX) { это.Икс = newX; }    общественный пустота setY(int новыйY) { это.у = новыйY; }}

Класс Point2D является изменяемым: его состояние можно изменить после создания, вызвав любой из методов установки (setX () или же setY ()).

Неизменяемый интерфейс для Point2D можно определить как:

общественный интерфейс ImmutablePoint2D {    общественный int getX();    общественный int GetY();}

Благодаря тому, что Point2D реализует ImmutablePoint2D, клиентский код теперь может ссылаться на тип, который не имеет методов изменения, и поэтому кажется неизменным. Это демонстрируется в следующем примере:

ImmutablePoint2D точка = новый Point2D(0,0);  // на конкретный экземпляр Point2D ссылается неизменяемый интерфейсint Икс = точка.getX(); // правильный вызов методаint у = точка.setX(42); // ошибка компиляции: метод setX () не существует для типа ImmutablePoint2D

Ссылаясь только на неизменяемый интерфейс, нельзя вызывать метод, который изменяет состояние конкретного объекта.

Преимущества

  • Ясно передает неизменное намерение типа.
  • В отличие от типов, реализующих Неизменяемая оболочка шаблон, не нужно "отменять" методы изменения путем выдачи "Нет операции "инструкция или выдача исключения времени выполнения при вызове метода изменения.

Недостатки

  • Экземпляры, на которые ссылается неизменяемый тип интерфейса, могут быть В ролях к их конкретному изменяемому типу, и их состояние изменилось. Например:
    общественный пустота мутировать(ImmutablePoint2D точка) {    ((Point2D)точка).setX(42); // этот вызов допустим, так как тип имеет                               // преобразован в изменяемый класс Point2D}
  • Конкретные классы должны явно декларировать, что они реализуют неизменяемый интерфейс. Это может быть невозможно, если конкретный класс «принадлежит» стороннему коду, например, если он содержится в библиотеке.
  • На самом деле объект не является неизменяемым и, следовательно, не подходит для использования в структурах данных, основанных на неизменности, таких как хеш-карты. И объект может быть изменен одновременно с "изменяемой стороны".
  • Некоторые оптимизации компилятора, доступные для неизменяемых объектов, могут быть недоступны для изменяемых объектов.

Альтернативы

Альтернативой неизменяемому шаблону интерфейса является неизменяемая оболочка шаблон.

Постоянные структуры данных фактически неизменяемы, но допускают измененные представления самих себя.

Рекомендации