Неизменные требования к шаблону - PullRequest
0 голосов
/ 03 декабря 2018

Я изучаю Неизменяемый шаблон с использованием Java, но не могу понять следующие два требования:

  1. Методы экземпляра, доступ к свойствам которых не должен изменять переменные экземпляра
  2. Убедитесь, чтоКонструктор неизменяемого класса является единственным местом, где значения переменных экземпляра устанавливаются или изменяются.

Пожалуйста, кто-нибудь приведёт простой пример для первого пункта.Во-вторых, я не могу понять, как мы можем изменить переменные через конструктор, пока они являются окончательными?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Ответ на ваш вопрос: Защитное копирование .Эта техника из " Эффективная Java " Джошуа Блоха.Он достаточно известен, поэтому вы можете прочитать об этом либо здесь или в другом месте .

0 голосов
/ 03 декабря 2018

Два пункта более или менее говорят об одном и том же.Они просто означают, что после инициализации объекта его не следует менять.

Для того, чтобы объект был действительно неизменным, каждый объект, на который есть ссылки, также не должен быть модифицирован методами доступа.Например, класс String поддерживается char[], который является изменяемым.Тем не менее, класс String не предоставляет никаких методов, позволяющих вам изменять содержимое его резервного массива.Таким образом, класс String можно считать неизменным.

Что касается конечных переменных - переменные должны быть в состоянии где-то быть установлены.Было бы бесполезно иметь конечную переменную, которую вы вообще не могли установить.Таким образом, конструктор имеет специальный корпус и позволяет устанавливать переменные, помеченные как окончательные.

class StringArrayList {

    // make the variable private, to protect it from being modified from outside the class
    private final String[] arr;

    StringArrayList(int size) {
        // constructors are the only method allowed to set final variables
        arr = new String[size];
    }

    String get(int i) {
        // get method doesn't change the state of the object, so is fine
        // However, if the object returned is mutable then there might be issues.
        return arr[i];
    }

    void set(int i, String item) {
        // set changes the state of arr, and so with this method, StringArrayList cannot 
        // be considered immutable
        arr[i] = item;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...