首页 > 解决方案 > 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;
}

标签: javastringequalslombok

解决方案


使用@Data 是一个捷径,其中包括@EqualsAndHashCode。尝试显式添加 @EqualsAndHashCode 并设置callSuper为 false。

但是,对于长期维护,在基类中重写 equals/hashCode 并仅返回 true/0 或将 @EqualsAndHashCode 应用于基类可能更安全。


推荐阅读