Одной из причин «необходимости» для неизменяемых классов является комбинация передачи всего по ссылке и отсутствие поддержки просмотра только для чтения объекта (например, C ++ const
).
Рассмотрим простой случай класса, имеющего поддержку шаблона наблюдателя:
class Person {
public string getName() { ... }
public void registerForNameChange(NameChangedObserver o) { ... }
}
Если string
не были неизменяемы, для класса Person
было бы невозможно реализовать registerForNameChange()
правильно, потому что
void foo(Person p) {
p.getName().prepend("Mr. ");
}
В C ++ getName()
, возвращающий const std::string&
, имеет эффект возврата по ссылке и предотвращения доступа к мутаторам, подразумевая, что в этом контексте необязательные классы не нужны.