繁体   English   中英

生成 equals/hashCode 实现但没有调用超类,即使此 class 不扩展 java.lang.Object

[英]Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object

我在使用lombok时遇到错误,甚至它也不允许我在创建student实例时设置 id 和 version。

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;
}

在此处输入图像描述

在 main 方法中,它不允许我设置 Id 和版本字段的值

Student s = Student.builder().firstName("Adam").lastName("Kerr").build();

Edit-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 有关:

  1. 生成 equals/hashCode 实现但没有调用超类,即使此类没有扩展 java.lang.Object。 如果这是故意的,请将“@EqualsAndHashCode(callSuper=false)”添加到您的类型中。

警告由@Data给出,因为这通常会在不调用 super 的情况下生成 equals/hashcode。 通过添加@EqualsAndHashCode(callSuper = true)来修复它。

  1. @Builder会给你一个编译警告,因为它会在超类和子类中生成两个同名的静态方法。 通过在Student上定义@Builder(builderMethodName = "studentBuilder")来修复它。

  2. 您将无法在 studentBuilder 上设置超类属性,因为您的超类和子类具有默认构造函数。 通过创建一个构造函数并将@Builder注释移动到它来修复它(即@Builder注释构造函数,而不是 class ):

代码:

@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

  • 您真的需要两种构造函数类型(尤其是无参数构造函数)吗? 他们是这里问题的一部分。 有时您需要它们才能使框架(代理、反射等)正常工作。

  • 更具体到您的代码:您在超类前面加上“I”,但它不是接口。 如果它是一个抽象类,请将其声明为abstract类并且不要给它一个@Builder

您可以使用@sfiss解决方案

或者

您可以使用@Getter@Setter注释代替@Data注释。

我有同样的问题,我以这种方式解决了它希望它对你有帮助。 也可以帮助您使用抽象类

学生.java

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

    @Builder
    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

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

构建 Spring 引导项目的警告

当我构建我的 Spring 启动项目时,我收到了 20 个关于同一件事的警告。 警告显示: Generating equals/hashCode implementation but without a call to superclass

警告说明

此警告来自lombook,当我们使用@Data @ToString @EqualsAndHashCode,IDE 将触发Generating equals/hashCode implementation but without a call to superclass父类//。

解决方案

有两种解决方案:

  1. 在 class 上添加注释@EqualsAndHashCode(callSuper = true)
  2. 在项目根路径中创建 lombook 配置文件: src/main/java 注意:此解决方案需要 lombook > 1.14 的版本。

我推荐解决方案 2,因为您不需要将注释添加到所有必需的类。

要实现该解决方案,您需要在src/main/java的路径中创建lombook.config 如果你有多个包,你可能需要创建多个配置文件。

配置文件的内容包括:

config.stopBubbling=true
lombok.equalsAndHashCode.callSuper=call

当我们重建我们的项目时,您将不会再收到这些警告。

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM