基于值的类

一些类,例如 java.lang.Integerjava.time.LocalDate ,是 value-based 。基于值的类具有以下属性:
  • 该类仅声明最终实例字段(尽管这些字段可能包含对可变对象的引用);
  • 类的 equalshashCodetoString 的实现仅根据类的实例字段(以及它们引用的对象的成员)的值计算它们的结果,而不是根据实例的身份;
  • 该类的方法在相等时将实例视为 freely substitutable,这意味着根据 equals() 交换任何两个相等的实例 xy 不会产生类方法行为的可见变化;
  • 该类不使用实例的监视器执行同步;
  • 该类未声明(或已弃用任何)可访问的构造方法;
  • 该类不提供任何实例创建机制来保证每个方法调用的唯一标识——特别是,任何工厂方法的契约都必须允许这样的可能性,即如果两个独立生成的实例根据 equals() 是相等的,那么它们也可能根据 equals() 是相等的到==
  • 该类是最终的,并且扩展了 Object 或抽象类的层次结构,这些抽象类没有声明实例字段或实例初始值设定项,并且其构造函数为空。

当基于值的类的两个实例相等时(根据 `equals`),程序不应该试图区分它们的身份,无论是直接通过引用相等还是间接通过诉诸同步、身份散列、序列化或任何其他身份敏感机制。

强烈建议不要对基于值的类的实例进行同步,因为程序员不能保证关联监视器的独占所有权。

基于值的类的身份相关行为可能会在未来的版本中发生变化。例如,同步可能会失败。