基于值的类
一些类,例如java.lang.Integer
和 java.time.LocalDate
,是 value-based 。基于值的类具有以下属性:
- 该类仅声明最终实例字段(尽管这些字段可能包含对可变对象的引用);
- 类的
equals
、hashCode
和toString
的实现仅根据类的实例字段(以及它们引用的对象的成员)的值计算它们的结果,而不是根据实例的身份; - 该类的方法在相等时将实例视为 freely substitutable,这意味着根据
equals()
交换任何两个相等的实例x
和y
不会产生类方法行为的可见变化; - 该类不使用实例的监视器执行同步;
- 该类未声明(或已弃用任何)可访问的构造方法;
- 该类不提供任何实例创建机制来保证每个方法调用的唯一标识——特别是,任何工厂方法的契约都必须允许这样的可能性,即如果两个独立生成的实例根据
equals()
是相等的,那么它们也可能根据equals()
是相等的到==
; - 该类是最终的,并且扩展了
Object
或抽象类的层次结构,这些抽象类没有声明实例字段或实例初始值设定项,并且其构造函数为空。
当基于值的类的两个实例相等时(根据 `equals`),程序不应该试图区分它们的身份,无论是直接通过引用相等还是间接通过诉诸同步、身份散列、序列化或任何其他身份敏感机制。
强烈建议不要对基于值的类的实例进行同步,因为程序员不能保证关联监视器的独占所有权。
基于值的类的身份相关行为可能会在未来的版本中发生变化。例如,同步可能会失败。