21966
|
1 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
2 |
<html lang="en">
|
|
3 |
<head>
|
|
4 |
<title>Value-based Classes</title>
|
|
5 |
<link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
|
|
6 |
</head>
|
|
7 |
<body>
|
|
8 |
<h2 id="ValueBased">Value-based Classes</h2>
|
|
9 |
|
|
10 |
Some classes, such as <code>java.util.Optional</code> and
|
|
11 |
<code>java.time.LocalDateTime</code>, are <em>value-based</em>. Instances of a
|
|
12 |
value-based class:
|
|
13 |
<ul>
|
|
14 |
<li>are final and immutable (though may contain references to mutable
|
|
15 |
objects);</li>
|
|
16 |
<li>have implementations of <code>equals</code>,
|
|
17 |
<code>hashCode</code>, and <code>toString</code> which are computed
|
|
18 |
solely from the instance's state and not from its identity or the state
|
|
19 |
of any other object or variable;</li>
|
|
20 |
<li>make no use of identity-sensitive operations such as reference
|
|
21 |
equality (<code>==</code>) between instances, identity hash code of
|
|
22 |
instances, or synchronization on an instances's intrinsic lock;</li>
|
|
23 |
<li>are considered equal solely based on <code>equals()</code>, not
|
|
24 |
based on reference equality (<code>==</code>);</li>
|
|
25 |
<li>do not have accessible constructors, but are instead instantiated
|
|
26 |
through factory methods which make no committment as to the identity
|
|
27 |
of returned instances;</li>
|
|
28 |
<li>are <em>freely substitutable</em> when equal, meaning that interchanging
|
|
29 |
any two instances <code>x</code> and <code>y</code> that are equal
|
|
30 |
according to <code>equals()</code> in any computation or method
|
|
31 |
invocation should produce no visible change in behavior.
|
|
32 |
</li>
|
|
33 |
</ul>
|
|
34 |
|
|
35 |
<p>A program may produce unpredictable results if it attempts to distinguish two
|
|
36 |
references to equal values of a value-based class, whether directly via reference
|
|
37 |
equality or indirectly via an appeal to synchronization, identity hashing,
|
|
38 |
serialization, or any other identity-sensitive mechanism. Use of such
|
|
39 |
identity-sensitive operations on instances of value-based classes may have
|
|
40 |
unpredictable effects and should be avoided.</p>
|
|
41 |
</body>
|
|
42 |
</html>
|