使用 ignorecase 生成 Lombok equals 方法

Generate Lombok equals method with ignorecase

可以注释 String 字段,因此 Lombok 生成一个忽略 String 值的字符大小写的 equals 方法。

也就是生成这样的东西:

public class Foo {
    private String bar;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Foo foo = (Foo) o;

        return bar != null ? StringUtils.equalsIgnoreCase(bar, foo.bar) : foo.bar == null;
    }    
}

可以,但不要这样做。

Lombok 不是定制工具。它是一种省略样板代码的工具。

@EqualsAndHashCode 生成代码,为每个要比较的字段调用 getters。 解决问题执行 getter:

public getBar() {
    return bar != null ? bar.toLowerCase() : null;
}

比较将小写。在此之后 getter 将 broken.

您可以从 equals 中排除字段并包含自定义函数:

@EqualsAndHashCode
class Foo {

    @EqualsAndHashCode.Exclude
    private String bar;

    @EqualsAndHashCode.Include
    private String normalizedBar() {
        return bar != null ? bar.toLowerCase() : null;
    }
}

这个问题涉及类似的问题:How to make Lombok's EqualsAndHashCode work with BigDecimal
更多讨论在这里:https://github.com/projectlombok/lombok/issues/1260#issuecomment-268114093