Есть несколько вещей, которые вы должны учитывать для создания неизменяемого класса:
final
- у вас уже есть private
и final
- Внесите соответствующие изменения в свой код List
или Date
, что делает их final
недостаточным. Вы должны вернуть защитную копию из своих getters
, чтобы их состояние не было мутировано с помощью методов вызова. Для 4-го пункта, скажем, у вас есть поле Date
в вашем class, то геттер для этого поля должен выглядеть так:
public Date getDate() {
return new Date(this.date.getTime());
}
Создание защитной копии может стать головной болью, когда ваше изменяемое поле включает в себя некоторое изменяемое поле и, в свою очередь, может содержать некоторые другие изменяемое поле. В этом случае вам нужно будет сделать копию каждого из них итеративно. Мы называем эту итеративную копию изменяемых полей как Deep Copy .
Реализация глубокой копии самостоятельно может быть громоздкой. Но, сохраняя эту проблему отдельно, вы должны снова рассмотреть свой классный дизайн, как только увидите, что вы попадаете в такое требование сделать глубокую защитную копию.