【问题标题】:Annotation or implementation for toString(), equals() and hashCode() methods? [closed]toString()、equals() 和 hashCode() 方法的注释或实现? [关闭]
【发布时间】:2021-11-27 11:21:57
【问题描述】:

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

@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. 实现这些方法是否合乎逻辑,因为它们已经在基类中实现了?是不是不需要在这里实现hashCode()equals()方法,在实体类的开头加上@ToString(callSuper = true)

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

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

【问题讨论】:

  • 有没有人对 Spring 或 Spring Boot 没有经验?
  • @KarthikeyanVaithilingam CHICO?有回复吗?
  • 注释是 lombok 的一部分,不是 spring 或 spring boot。这些注释用于减少代码并在您实现了没有注释的情况下具有默认实现。请注意,我不是反对者。
  • @KarthikeyanVaithilingam 非常感谢朋友,投了赞成票 ;)

标签: java annotations tostring lombok


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

【讨论】:

  • 完美的解释非常感谢。关于#3,我认为我的方法是正确的(我们应该坚持对所有 3 种方法进行注释或对所有 3 种方法进行实现)?
  • 朋友???有任何回复吗?
  • 没错,您应该选择一种方法并采用它。我会选择注释。
  • @Alex 你还有什么问题吗?
  • 完美!!!投票并标记为答案;)
【解决方案2】:

您使用的诸如“Getter Setter NoArgsConstructor ToString”之类的注释属于lombok。 在您的情况下,我认为使用 lombok 的 @Data 注释是一种更好的方法。

@Data 就像隐含的@Getter、@Setter、@ToString, @EqualsAndHashCode 和 @RequiredArgsConstructor 注解 类。

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

【讨论】:

  • 非常感谢 chico,投了赞成票 ;)
猜你喜欢
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多