lombok.xxx.callSuper が有効にならない

序文

lombok.configグローバル構成を使用する場合はlombok.equalsAndHashCode.callSuper = call、Lombok バージョンを少なくとも1.16.8にアップグレードすることをお勧めします。[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-tAeNHfv4-1658228942869) (C:\Users\riyou.jiang\AppData\Roaming\ Typora\typora-user-images\image-20220719181047317.png)]

lombok.configグローバル構成を使用する場合はlombok.toString.callSuper = call、Lombok バージョンを少なくとも1.18.6にアップグレードすることをお勧めします。

ここに画像の説明を挿入

詳細については、次を参照してください: Lombok の変更ログ

質問

現在、Lombok は多かれ少なかれ使用されていますが、Lombok がコードにもたらす可読性と保守性の問題は言うまでもありません。

ツール自体に制限される使用シナリオだけの観点からは、利便性をもたらしながら、より「怠惰」であるほど、より高い利便性が期待されます。

今日のトピックに関する限り、EqualsAndHashCode@ToStringまたは@Data@Value対応する関数を含むアノテーションは、継承があるObject場合、デフォルトで自身のクラスのみが考慮され、親クラスは含まれません。

@Data
public class User {
    
    
    private Long userId;
    
    @Data
    public static class ExtendUser extends User {
    
    
        private String name;
    }
}
public static void test() {
    
    
    ExtendUser user1 = new ExtendUser();
    user1.setUserId(1L);
    user1.setName("name");
    ExtendUser user2 = new ExtendUser();
    user2.setUserId(2L);
    user2.setName("name");
    System.out.println("hashEqRes=" + (user1.hashCode()==user2.hashCode()));
    System.out.println("eqRes=" + user1.equals(user2));
    System.out.println(user1);
}

出力結果:

hashEqRes=true
eqRes=true
User.ExtendUser(name=name)

equal()、 、hashCode()または のいずれであっても、toString()現在のクラスのみが考慮され、Userクラスはわかります。

この問題を解決したい場合、一般的な方法は2つです

  • callSuper = true で注釈を付ける
  • lombok.configファイルとグローバル callSuper 設定。

注釈方法

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public static class ExtendUser extends User

アノテーションは callSuper パラメーターをサポートしていないため、アノテーションを使用したとしても、andを明示的に使用する必要があること@Dataわかります@Data@ToString@EqualsAndHashCode

効果を見てみましょう:

hashEqRes=false
eqRes=false
User.ExtendUser(super=User(userId=1), name=name)

確かに、関連する生成メソッドに親クラス フィールドが含まれていないという問題は解決できますが、欠点は、

  • 1つは、便利なアノテーションを使用しながら、機能アノテーションだけを使用する必要があることです。
  • 2 つ目は、多数のクラスに親クラスを含める必要がある場合、作業を繰り返す必要があり、時間が無駄になることです。

したがって、この問題を解決するために、Lombok はそれぞれ1.16.8 と 1.18.6グローバル構成@ToString@EqualsAndHashCodeメソッドを導入しました。

グローバル構成

注: バージョンは構成をサポートしている必要があります。! ! !

グローバル構成はlombok.configファイル、プロジェクトのルート ディレクトリに配置して有効にすることができます。

# 全局设置@EqualsAndHashCode的callSuper属性为true
lombok.equalsAndHashCode.callSuper = call
# 全局设置@ToString的callSuper属性为true
lombok.toString.callSuper = call

これら 2 つの有効な値はcall/skip/warn.

  • skip 親クラス フィールドは含まれません。
  • warn親クラス フィールドは含まれませんが、コンパイル時に警告が生成されます。
    • PS:@EqualsAndHashCode警告の場合、idea はコード上でプロンプトを生成しますが、生成@ToStringしません。
    • Lombok プラグインはすでに最新です。アイデアのバージョンがサポートしていない可能性があります (2019.3)。
  • call親クラスのフィールドを含め、それがあなたが望むものです。

デフォルト値では、この 2 つが異なることに注意してください。@ToStringis のデフォルト値skip@EqualsAndHashCodeis のデフォルト値ですwarn

warnでレンダリングされた結果:

ここに画像の説明を挿入

callの下のレンダリング結果:

hashEqRes=false
eqRes=false
User.ExtendUser(super=User(userId=1), name=name)

現在のバージョンが特定のグローバル構成をサポートしているかどうかを確認する方法

以前にグローバルに追加したlombok.toString.callSuper = callので心配ありません。有効になるかどうかは気にしませんでした。

その結果、半年間のデバッグの後、突然ToString印刷に根本的な原因は、バージョンがそれをサポートしていないことです。

lombok.ConfigurationKeys現在のバージョンでサポートされている構成キーを確認できます。

ここに画像の説明を挿入

どのバージョンがサポートされているかは、記事の冒頭にある github または変更ログで確認できます。

おすすめ

転載: blog.csdn.net/jiangxiayouyu/article/details/125878833