# Value-based Classes

Some classes, such as `java.util.Optional` and `java.time.LocalDateTime`, are value-based. Instances of a value-based class:

- are final and immutable (though may contain references to mutable objects);
- have implementations of `equals`, `hashCode`, and `toString` which are computed solely from the instance's state and not from its identity or the state of any other object or variable;
- make no use of identity-sensitive operations such as reference equality (`==`) between instances, identity hash code of instances, or synchronization on an instances's intrinsic lock;
- are considered equal solely based on `equals()`, not based on reference equality (`==`);
- do not have accessible constructors, but are instead instantiated through factory methods which make no commitment as to the identity of returned instances;
- are freely substitutable when equal, meaning that interchanging any two instances `x` and `y` that are equal according to `equals()` in any computation or method invocation should produce no visible change in behavior.

A program may produce unpredictable results if it attempts to distinguish two references to equal values of a value-based class, whether directly via reference equality or indirectly via an appeal to synchronization, identity hashing, serialization, or any other identity-sensitive mechanism. Use of such identity-sensitive operations on instances of value-based classes may have unpredictable effects and should be avoided.