龙目岛:等于子类中的字符串实例变量

时间:2019-06-12 13:33:07

标签: java string equals 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;

}

其中AbstractName是一个空的抽象类。我想用{p>

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的子类,它不会失败。


香草Java

这是由AbstractName

创建的代码
Lombok

1 个答案:

答案 0 :(得分:2)

使用@Data是包含@EqualsAndHashCode的捷径。尝试显式添加@EqualsAndHashCode并将callSuper设置为false。

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