Мне нравится неизменный «шаблон» из-за его сильных сторон, и в прошлом я находил его полезным для разработки систем с неизменными типами данных (некоторые, большинство или даже все). Часто, когда я это делаю, я пишу меньше ошибок, и отладка становится намного проще.
Однако мои сверстники в целом уклоняются от неизменности. Они не совсем неопытны (отнюдь не так), но все же пишут объекты данных классическим способом - частные члены с геттером и сеттером для каждого члена. Тогда обычно их конструкторы не принимают аргументов или, возможно, просто принимают некоторые аргументы для удобства. Так часто создание объекта выглядит так:
Foo a = new Foo();
a.setProperty1("asdf");
a.setProperty2("bcde");
Может быть, они делают это везде. Может быть, они даже не определяют конструктор, который принимает эти две строки, независимо от того, насколько они важны. И, возможно, они не изменяют значение этих строк позже и никогда не должны. Ясно, что если бы все это было правдой, объект был бы лучше спроектирован как неизменный, верно? (конструктор принимает два свойства, вообще не устанавливает).
Как вы решаете, должен ли тип объекта быть неизменным? Есть хороший набор критериев, чтобы судить об этом?
В настоящее время я спорю о том, стоит ли переключать несколько типов данных в моем собственном проекте на неизменяемые, но мне пришлось бы обосновать это для своих коллег, и данные в типах могут (ОЧЕНЬ редко) меняться - в это время вы, конечно, можете изменить это неизменный способ (создайте новый, скопировав свойства из старого объекта, за исключением тех, которые вы хотите изменить). Но я не уверен, является ли это просто моей любовью к неизменным, или есть ли в них реальная потребность / польза от них.