Инвариант петли (Java)

Есть несколько вещей, которые вы должны учитывать для создания неизменяемого класса:

  • Сделайте свой класс final - у вас уже есть
  • Сделайте все поля private и final - Внесите соответствующие изменения в свой код
  • Не предоставляйте какие-либо методы, которые изменяют состояние вашего экземпляра
  • Если у вас есть изменяемые поля в вашем классе, например List или Date, что делает их final недостаточным. Вы должны вернуть защитную копию из своих getters, чтобы их состояние не было мутировано с помощью методов вызова.

Для 4-го пункта, скажем, у вас есть поле Date в вашем class, то геттер для этого поля должен выглядеть так:

public Date getDate() {
    return new Date(this.date.getTime());
}

Создание защитной копии может стать головной болью, когда ваше изменяемое поле включает в себя некоторое изменяемое поле и, в свою очередь, может содержать некоторые другие изменяемое поле. В этом случае вам нужно будет сделать копию каждого из них итеративно. Мы называем эту итеративную копию изменяемых полей как Deep Copy .

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

0
задан Kick Buttowski 27 January 2015 в 03:46
поделиться