java - 所有属性都必须影响 JavaBean 的 hashcode() 和 equals() 方法吗?

标签 java javabeans equals hashcode specifications

要使类成为有效的 Javabean(根据 JavaBeans Specification ),是否应在其 equals() 中测试其所有属性方法 - 并相应地影响其 hascode()执行?或者有些属性可能会被故意搁置?

例如,类 Person 具有:

  • 在 geters 和 setter 中公开的 idname 属性
  • 无参数构造函数
  • equalshashcode 方法仅考虑 id

是否有资格成为有效的 JavaBean?

最佳答案

与其他 Java 规范不同,Java Beans 规范相当模糊。这个想法是 bean 封装了一些可重用的功能,重点是 GUI。在制定本规范时,有一种想法是开发人员出售单独的组件,例如一些 GUI 元素。

A Java Bean is a reusable software component that can be manipulated visually in a builder tool.

该规范将 Java bean 与“普通”Java 库区分开来:

Not all useful software modules should necessarily turn into beans. Beans are appropriate for software components that can be visually manipulated and customized to achieve some effect. Class libraries are an appropriate way of providing functionality that is useful to programmers, but which doesn't benefit from visual manipulation.

该规范没有定义 hashCode() 的任何要求和equals() 。实现或不实现它们取决于您。对构造函数也没有要求。

如果您的类为 GUI 提供了一些可重用的功能,您可以将其称为 Java Bean。如果您的类不在 GUI 中绘制任何元素,也不对 GUI 事件使用react,那么它就不是本规范意义上的 Java bean。但是,您是否经常看到用 Java 实现 GUI 的应用程序? :)

许多开发人员将仅满足本规范中部分要求(主要在第 8.1、8.2、8.3、8.6 节中定义)的任何类称为 Java bean,并忽略任何其他要求,例如有关监听器和监听器的要求。事件。从这个意义上说,您的类是一个 Java bean。

hashCode() 和 equals(): 由您决定是否使用 hashCode() 中的某些属性和equals() 。这取决于用例。例如,您的类(class)有 4 个属性:ID、名字、姓氏和最喜欢的饮料。在一种用例中,您可能需要仅通过名称来区分对象实例。那么您将在 hashCode() 中仅使用名字和姓氏。和equals() ,并忽略 ID 和最喜欢的饮料。在其他一些用例中,您可能会将此类视为对人的饮料分配,并且您不仅需要在 hashCode() 中包含名字和姓氏,还需要包含最喜欢的饮料。和equals() 。在某些其他用例中,您可能会受到约束,即每个属性组合都是唯一的,并且为了区分实例,使用 ID 就足够了,因此 hashCode() 中只有一个属性 ID和equals() 。根据您的目标,您会以不同的方式实现这些方法。

关于java - 所有属性都必须影响 JavaBean 的 hashcode() 和 equals() 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58016727/

相关文章:

java - 在jsf中显示图像

java - 从 WAR 中的其他 Maven 模块导入 Spring bean?

php - PHP(如果单或双等于)

java - 将 Java 对象传递到 Retrofit 中未正确处理

java - 由于我的 IntelliJ 设置,Maven 安装失败

java System.nanoTime 真的很慢。是否可以实现高性能的 Java 分析器?

Java - Set.contains() 在 OpenJDK 6 上损坏了吗?

java - 具有已定义数组的 NullPointerException

java - 有什么方法可以使用自定义 BeanWrapper 实现来加载应用程序上下文

c# - List<T>.Contains 和 T[].Contains 的行为不同