java - Lombok:等于子类中的字符串实例变量
问题描述
Lombok
当我遇到这个小问题时,我最近偶然发现并想对其进行测试。
假设我有
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Name extends AbstractName {
@NonNull
private String firstname;
@NonNull
private String lastname;
}
whereAbstractName
是一个空的抽象类。我想equals
用
@Test
public void testEquals() {
Name instance1 = new Name("Vorname","Nachname");
Name instance2 = new Name("Vorname","Nachname");
boolean expResult = true;
boolean result = instance1.equals(instance2);
assertEquals(expResult, result);
}
如您所见,我希望 的两个实例Name
相等。如果您添加
System.out.println(instance1.getFirstname().equals(instance2.getFirstname()));
System.out.println(instance1.getLastname().equals(instance2.getLastname()));
一个得到
true
true
那么,为什么测试会失败呢?是不是hashCode()
继承的问题AbstractName
?我该如何解决?
顺便说一句,它不会失败,如果Name
是独立类而不是AbstractName
.
香草爪哇
这是由创建的代码Lombok
@java.lang.Override
@java.lang.SuppressWarnings("all")
@lombok.Generated
public boolean equals(final java.lang.Object o) {
if (o == this) return true;
if (!(o instanceof Name)) return false;
final Name other = (Name) o;
if (!other.canEqual((java.lang.Object) this)) return false;
if (!super.equals(o)) return false;
final java.lang.Object this$firstname = this.getFirstname();
final java.lang.Object other$firstname = other.getFirstname();
if (this$firstname == null ? other$firstname != null : !this$firstname.equals(other$firstname)) return false;
final java.lang.Object this$lastname = this.getLastname();
final java.lang.Object other$lastname = other.getLastname();
if (this$lastname == null ? other$lastname != null : !this$lastname.equals(other$lastname)) return false;
return true;
}
解决方案
使用@Data 是一个捷径,其中包括@EqualsAndHashCode。尝试显式添加 @EqualsAndHashCode 并设置callSuper
为 false。
但是,对于长期维护,在基类中重写 equals/hashCode 并仅返回 true/0 或将 @EqualsAndHashCode 应用于基类可能更安全。
推荐阅读
- node.js - 树莓派零 W 要睡觉了
- flutter - 如何使用 URL [SERVER/FLUTTER] 流式传输 mp3 文件
- docker - docker image 找不到文件或路径
- ios - 命令 PhaseScriptExecution 失败,Xcode 中的退出代码为非零
- flutter - Flutter - 英雄小部件 - 2 个具有相同键的英雄?
- angular - 角形材料小吃店在服务?
- javascript - 在 React 中处理 null 道具的最佳实践?
- spring-security - Spring Security:具有多个客户端的自定义 RequestEntityConverter
- android - 我有一个关于在颤振中使用 Webview 的问题
- java - Java 嵌套循环。试图重申内部循环