toString()、equals() 和 hashCode() 方法的注释或实现?

Annotation or implementation for toString(), equals() and hashCode() methods?

我在存储库中看到了以下实现,我很困惑:

@Entity
@Getter
@Setter
@ToString(callSuper = true)
@NoArgsConstructor
public class Employee extends BaseEntity {

    // properties

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object other) {
        return super.equals(other);
    }
}

我的问题是:

  1. 实现这些方法是否合乎逻辑,因为它们已经在基础 class 中实现了?是不是不需要在这里实现hashCode()equals()方法,在实体class开头加上@ToString(callSuper = true)

  2. 在实体中添加这些方法,使用注解比每个方法添加3-4行代码更好吗?

  3. 我认为这些方法存在误用。因为其中 2 个已实现,其中一个 (toString) 是通过注释添加的。我认为所有这些都应该以相同的方式使用(全部通过注释或全部通过实现)。我错了吗?

  1. 是的,您也应该在 child 类 中实现它们。原因是您在 hashCode()equals().
  2. 上都应考虑它们的其他属性
  3. 这是个人意见。有些人喜欢完全控制代码,有些人乐于编写更少的代码并依赖 lombok 等依赖项。我会使用注释。如果您需要更复杂的东西,那么您可以随时自己编写方法。
  4. 如果您有注释,则不应实现该方法或您自己的方法,除非您想避免注释完成他的工作。一般来说,如果您对注释没问题,就应该坚持下去。重要的是要保持一致,这样代码才可读。

您正在使用的注释,如“Getter Setter NoArgsConstructor ToString”属于lombok。 对于您的情况,我认为使用 lombok 的 @Data 注释是更好的方法。

@Data is like having implicit @Getter, @Setter, @ToString, @EqualsAndHashCode and @RequiredArgsConstructor annotations on the class.

请注意,如果您的实体具有超类,那么大多数情况下您应该将参数 callSuper=true 设置为@ToString 和@EqualsAndHashCode。 您可以参考 Lombok data 了解更多信息。