Часто полезно классифицировать объекты как инкапсулирующие значения или сущности, с отличием в том, что если что-то является значением, код, содержащий ссылку на него, никогда не должен видеть изменения своего состояния каким-либо образом, который сам код не инициировал. Напротив, код, который содержит ссылку на объект, может ожидать, что он изменится способами, не зависящими от держателя ссылки.
Хотя можно использовать инкапсулированное значение, используя объекты изменяемого или неизменяемого типов, объект может вести себя как значение, только если применяется хотя бы одно из следующих условий:
Никакая ссылка на объект никогда не будет подвергаться воздействию чего-либо, что может изменить состояние, заключенное в нем.
Держатель хотя бы одной из ссылок на объект знает все виды использования, к которым может быть применена любая существующая ссылка.
Поскольку все экземпляры неизменяемых типов автоматически удовлетворяют первому требованию, их легко использовать в качестве значений. С другой стороны, обеспечить выполнение любого из этих требований при использовании изменяемых типов намного сложнее. Принимая во внимание, что ссылки на неизменяемые типы могут быть свободно переданы как средство инкапсуляции заключенного в них состояния, для обхода состояния, хранящегося в изменяемых типах, требуется либо создание неизменяемых объектов-оболочек, либо копирование состояния, инкапсулированного частными объектами, в другие объекты, которые либо предоставлены, либо созданы для получателя данных.
Неизменяемые типы очень хорошо работают для передачи значений и часто, по крайней мере, в некоторой степени пригодны для манипулирования ими. Однако они не так хороши в обращении с сущностями. Наиболее близкой вещью, которую можно иметь к сущности в системе с чисто неизменяемыми типами, является функция, которая, учитывая состояние системы, сообщит об этих атрибутах некоторой ее части или создаст новый экземпляр состояния системы, который похож на поставляется один, за исключением какой-то конкретной его части, которая будет отличаться по выбору. Кроме того, если цель объекта состоит в том, чтобы связать некоторый код с чем-то, что существует в реальном мире, для объекта может быть невозможно избежать демонстрации изменяемого состояния.
Например, если кто-то получает данные по TCP-соединению, он может создать новый объект «состояние мира», который включает эти данные в свой буфер, не затрагивая ссылки на старое «состояние мира», но старые копии состояние мира, которое не включает последнюю порцию данных, будет дефектным и не должно использоваться, так как они больше не будут соответствовать состоянию реального сокета TCP.