Lombok: равно для переменных экземпляра строки в подклассе - PullRequest
1 голос
/ 12 июня 2019

Я недавно наткнулся на 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;
}

1 Ответ

2 голосов
/ 12 июня 2019

Использование @Data - это короткий путь, который включает @EqualsAndHashCode.Попробуйте явно добавить @EqualsAndHashCode и установить для callSuper значение false.

Однако для долгосрочного обслуживания может быть безопаснее переопределить equals / hashCode в базовом классе и просто вернуть true / 0 или применить @EqualsAndHashCode для базового класса.

...