2017-08-23 10:58:11 -07:00
|
|
|
<!doctype html>
|
2020-01-24 12:51:34 +00:00
|
|
|
<!--
|
|
|
|
Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
|
|
|
|
|
|
This code is free software; you can redistribute it and/or modify it
|
|
|
|
under the terms of the GNU General Public License version 2 only, as
|
|
|
|
published by the Free Software Foundation. Oracle designates this
|
|
|
|
particular file as subject to the "Classpath" exception as provided
|
|
|
|
by Oracle in the LICENSE file that accompanied this code.
|
|
|
|
|
|
|
|
This code is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
version 2 for more details (a copy is included in the LICENSE file that
|
|
|
|
accompanied this code).
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License version
|
|
|
|
2 along with this work; if not, write to the Free Software Foundation,
|
|
|
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
|
|
|
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
|
|
or visit www.oracle.com if you need additional information or have any
|
|
|
|
questions.
|
|
|
|
-->
|
2013-12-03 21:22:14 -08:00
|
|
|
<html lang="en">
|
|
|
|
<head>
|
|
|
|
<title>Value-based Classes</title>
|
2018-10-15 17:52:42 +05:30
|
|
|
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
|
2013-12-03 21:22:14 -08:00
|
|
|
</head>
|
|
|
|
<body>
|
2020-01-24 12:51:34 +00:00
|
|
|
<h1 id="ValueBased">{@index "Value-based Classes"}</h1>
|
2013-12-03 21:22:14 -08:00
|
|
|
|
|
|
|
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
|
2020-01-24 12:51:34 +00:00
|
|
|
through factory methods which make no commitment as to the identity
|
2013-12-03 21:22:14 -08:00
|
|
|
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>
|