@ У ДжаредПара самый лучший ответ, IMO, но ни один из ответов не является хорошим, потому что сегодня не существует "хороших" решений для этого. Нам нужны лучшие инструменты и руководящие принципы проектирования, которые развиваются вместе с инструментами, чтобы лучше справляться с растущей популярностью неизменных объектов.
@ Ответ JonSkeet хорошо работает в контексте API, где почти все изменчиво, но оно падает, когда неизменяемые объекты становятся нормой (так как все методы имеют длинные ужасные имена).
«Лучшее» имя зависит от контекста кода, который вы окружаете. Джаред упоминает, что единственная стратегия, которая, на мой взгляд, жизнеспособна во всем спектре от «в основном изменчивого» до «в основном неизменяемого» контекста, где инструментарий делает очевидным, является ли данный объект неизменным, и тогда у каждого метода есть «императив». name (egoAdd), которое либо оказывает побочный эффект на объект-получатель (если он изменчив), либо возвращает новый объект (если он неизменен).
(Помимо: к сожалению, «плавные» эффективные API-интерфейсы, такие как «StringBuilder», означают, что вы не можете просто посмотреть на сигнатуру метода, чтобы решить, является ли объект-получатель неизменным, поскольку такие примеры «возвращают это», чтобы обеспечить плавность, давая та же подпись, что и «вернуть копию».)