Мені подобається незмінна «картина» через її сильні сторони, і в минулому мені було вигідно розробити системи з непорушними типами даних (деякі, більшість чи навіть усі). Часто, коли я роблю це, мені трапляється писати менше помилок, а налагодження набагато простіше.
Однак мої однолітки взагалі ухиляються від непорушного. Вони взагалі недосвідчені (далеко не це), але вони записують об'єкти даних класичним способом - приватні члени з геттером та сеттером для кожного члена. Тоді зазвичай їх конструктори не беруть ніяких аргументів, а може просто беруть якісь аргументи для зручності. Тому часто створення об'єкта виглядає так:
Foo a = new Foo();
a.setProperty1("asdf");
a.setProperty2("bcde");
Можливо, вони роблять це скрізь. Можливо, вони навіть не визначають конструктора, який приймає ці два рядки, незалежно від того, наскільки вони важливі. І, можливо, вони не змінюють значення цих рядків пізніше і ніколи не потребують цього. Ясна річ, якщо ці речі правдиві, об'єкт було б краще задумано як непорушний, правда? (конструктор приймає два властивості, сетерів немає взагалі).
Як ви вирішите, чи слід об'єкт типу проектувати як незмінний? Чи є гарний набір критеріїв, за якими можна судити?
В даний час я обговорюю питання про те, чи переключити кілька типів даних у власному проекті на незмінні, але мені доведеться виправдовувати це своїм колегам, і дані цих типів можуть (ДУЖЕ рідко) змінюватися - в цей час ви, звичайно, можете змінити це незмінний спосіб (створити новий, копіюючи властивості зі старого об'єкта, за винятком тих, які потрібно змінити). Але я не впевнений, чи це лише моя любов до непорушних проявів, чи є фактична потреба в / вигоді від них.