gpt4 book ai didi

java - 生成 equals/hashCode 实现但没有调用父类(super class),即使这个类没有扩展 java.lang.Object

转载 作者:行者123 更新时间:2023-12-03 10:04:28 30 4
gpt4 key购买 nike

使用 lombok 时出现错误甚至它也不允许我在创建 student 时设置 ID 和版本实例。

Multiple markers at this line
- overrides com.example.demo.IModel.canEqual
- Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is
intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.
- overrides com.example.demo.IModel.hashCode
- overrides com.example.demo.IModel.toString
- overrides com.example.demo.IModel.equals

模型
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IModel {
private String id;
private String version;
}

学生
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student extends IModel{
private String firstName;
private String lastName;
}

enter image description here

在 main 方法中,它不允许我设置 Id 和版本字段的值
Student s = Student.builder().firstName("Adam").lastName("Kerr").build();

编辑 1
@sfiss - 正如建议的那样,现在我更改如下,但现在我无法设置名字和姓氏,只能设置 cab 设置 id 和版本

学生.java
@Data
@Builder(builderMethodName = "studentBuilder")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Student extends IModel {
@NotEmpty(message = "{email.notempty}")
@Email
private String firstName;
private String lastName;

public Student(final String firstName, final String lastName, final String id, final String version) {
super(id, version);
this.firstName = firstName;
this.lastName = lastName;
}
}

IModel.java
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IModel {
private String id;
private String version;
}

最佳答案

这里有多个问题,所有这些问题都与使用带有继承的 lombok 有关:

  • Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.


  • 警告由 @Data 给出因为这通常会在不调用 super 的情况下生成 equals/hashcode。通过添加 @EqualsAndHashCode(callSuper = true) 来修复它.
  • @Builder给你一个编译警告,因为它会在父类(super class)和子类中生成两个同名的静态方法。通过定义 @Builder(builderMethodName = "studentBuilder") 来修复它在 Student .
  • 您将无法在 studentBuilder 上设置父类(super class)属性,因为您的父类(super class)和子类具有默认构造函数。通过创建构造函数并移动 @Builder 来修复它对其进行注释(即用 @Builder 注释构造函数,而不是类):

  • 代码:
    @Builder(builderMethodName = "studentBuilder")
    public Student(
    final String firstName,
    final String lastName,
    final String id,
    final String version) {
    super(id, version);
    this.firstName = firstName;
    this.lastName = lastName;
    }

    使用正确的方法调用您的构建器( IModel.builder()Student.studentBuilder() ):
    Student.studentBuilder().firstName("Name").build();

    我还想对上述解决方案进行一些改进。虽然我喜欢 lombok 作为工具(我真的不需要阅读那么多样板文件),但防止样板文件的第一个解决方案是考虑是否需要所有这些 getter 和 setter 并问自己以下问题:
  • 你想要数据包吗?对于某些用例来说这很好,在其他用例中,您需要更多 OOP 意义上的对象,即不要暴露您的状态而是行为。
  • 你真的需要可变性吗?如果没有,请选择 @Value .
  • 您真的需要两种构造函数类型(尤其是无参数构造函数)吗?他们是这里问题的一部分。有时您需要它们才能使框架(代理、反射等)正常工作。
  • 更具体到您的代码:您在父类(super class)前面加上“I”,但它不是接口(interface)。如果它是一个抽象类,声明它abstract不要给它一个@Builder .
  • 关于java - 生成 equals/hashCode 实现但没有调用父类(super class),即使这个类没有扩展 java.lang.Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56583423/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com