序文
lombok.config
グローバル構成を使用する場合はlombok.equalsAndHashCode.callSuper = call
、Lombok バージョンを少なくとも1.16.8にアップグレードすることをお勧めします。
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)。
- PS:
call
親クラスのフィールドを含め、それがあなたが望むものです。
デフォルト値では、この 2 つが異なることに注意してください。@ToString
is のデフォルト値skip
と@EqualsAndHashCode
is のデフォルト値ですwarn
。
warn
でレンダリングされた結果:
call
の下のレンダリング結果:
hashEqRes=false
eqRes=false
User.ExtendUser(super=User(userId=1), name=name)
現在のバージョンが特定のグローバル構成をサポートしているかどうかを確認する方法
以前にグローバルに追加したlombok.toString.callSuper = call
ので心配ありません。有効になるかどうかは気にしませんでした。
その結果、半年間のデバッグの後、突然ToString
印刷に根本的な原因は、バージョンがそれをサポートしていないことです。
lombok.ConfigurationKeys
現在のバージョンでサポートされている構成キーを確認できます。
どのバージョンがサポートされているかは、記事の冒頭にある github または変更ログで確認できます。