jdk/src/java.base/share/classes/java/lang/doc-files/ValueBased.html
author thartmann
Tue, 03 Nov 2015 09:42:11 +0100
changeset 33663 2cd62a4bd471
parent 25859 3317bb8137f4
child 46900 e92e67ed12b4
permissions -rw-r--r--
8141132: JEP 254: Compact Strings Summary: Adopt a more space-efficient internal representation for strings. Reviewed-by: alanb, bdelsart, coleenp, iklam, jiangli, jrose, kevinw, naoto, pliden, roland, smarks, twisti Contributed-by: Brent Christian <brent.christian@oracle.com>, Vivek Deshpande <vivek.r.deshpande@intel.com>, Tobias Hartmann <tobias.hartmann@oracle.com>, Charlie Hunt <charlie.hunt@oracle.com>, Vladimir Kozlov <vladimir.kozlov@oracle.com>, Roger Riggs <roger.riggs@oracle.com>, Xueming Shen <xueming.shen@oracle.com>, Aleksey Shipilev <aleksey.shipilev@oracle.com>, Sandhya Viswanathan <sandhya.viswanathan@intel.com>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
  <title>Value-based Classes</title>
  <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
</head>
<body>
<h2 id="ValueBased">Value-based Classes</h2>

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

<p>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.</p>
</body>
</html>