Я недавно наткнулся на 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
- пустой абстрактный класс.Я хочу проверить метод 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
.
Vanilla Java
Это код, созданный 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;
}