Jump to content

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

В объектно-ориентированном программировании « неизменяемый интерфейс » — это шаблон проектирования неизменяемого объекта . [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
    }
    
  • Конкретные классы должны явно заявить, что они реализуют неизменяемый интерфейс. Это может быть невозможно, если конкретный класс «принадлежит» стороннему коду, например, если он содержится в библиотеке.
  • Объект на самом деле не является неизменяемым и, следовательно, не подходит для использования в структурах данных, основанных на неизменности, таких как хэш-карты. И объект может быть изменен одновременно с «изменяемой стороны».
  • Некоторые оптимизации компилятора, доступные для неизменяемых объектов, могут быть недоступны для изменяемых объектов.

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

[ редактировать ]

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

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

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d814d667eaacd3401bd833424e2bfa99__1704106800
URL1:https://arc.ask3.ru/arc/aa/d8/99/d814d667eaacd3401bd833424e2bfa99.html
Заголовок, (Title) документа по адресу, URL1:
Immutable interface - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)