Обычно игнорируемые, но важные свойства неизменяемых объектов
В дополнение к ответу, предоставленному @ nsfyn55, необходимо учитывать следующие аспекты неизменяемости объектов, которые имеют простое значение.
Рассмотрим следующие классы:
public final class ImmutableClass {
private final MutableClass mc;
public ImmutableClass(MutableClass mc) {
this.mc = mc;
}
public MutableClass getMutClass() {
return this.mc;
}
}
public class MutableClass {
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
public class MutabilityCheck {
public static void main(String[] args) {
MutableClass mc = new MutableClass();
mc.setName("Foo");
ImmutableClass iMC = new ImmutableClass(mc);
System.out.println(iMC.getMutClass().getName());
mc.setName("Bar");
System.out.println(iMC.getMutClass().getName());
}
}
Ниже будет вывод из MutabilityCheck:
Foo
Bar
Важно отметить, что
Построение изменяемых объектов на неизменяемом объекте (через конструктор), либо «копированием» , либо «закрытием» переменных экземпляра неизменяемого объекта, описываемых следующимизменения:
public final class ImmutableClass {
private final MutableClass mc;
public ImmutableClass(MutableClass mc) {
this.mc = new MutableClass(mc);
}
public MutableClass getMutClass() {
return this.mc;
}
}
public class MutableClass {
private String name;
public MutableClass() {
}
//copy constructor
public MutableClass(MutableClass mc) {
this.name = mc.getName();
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
по-прежнему не обеспечивает полную неизменность, поскольку из класса MutabilityCheck по-прежнему действует следующее:
iMC.getMutClass().setName("Blaa");
Тем не менее, запуск MutabilityCheck с изменениями, сделанными в 1., приведет к выводу:
Foo
Foo
Для достижения полной неизменности на объекте всеего зависимые объекты также должны быть неизменными