Lombok ライブラリにより、記述されるコードの量が削減され、可読性が向上します。 使用例。3 つのフィールドを持つ通常のクラス
Person
:
public class Person {
private String name;
private int age;
private Cat cat;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name) &&
Objects.equals(cat, person.cat);
}
@Override
public int hashCode() {
return Objects.hash(name, age, cat);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", cat=" + cat +
'}';
}
}
ロンボク島でも同じ事
@Data
public class Person {
private String name;
private int age;
private Cat cat;
}
大量のコードを削除しましたが、すべてのメソッドと修飾子は残りました。使い方。Lombok はコンパイル時にコードを生成します。lombok ライブラリ自体が実行時に見つかりません。これを使用してもプログラムのサイズは増加しません。Lombok を使用する場合、ソース コードは有効な Java コードではなくなります。したがって、IDE のプラグインをインストールする必要があります。そうしないと、開発環境が何を処理しているのかを理解できなくなります。Lombok はすべての主要な Java IDE をサポートしています。統合はシームレスです。「使用法を表示」や「実装に移動」などのすべての機能は以前と同様に機能し、適切なフィールド/クラスに移動します。したがって、単純なクラスの場合は、アノテーションを使用できます@Data
。 - コンストラクター、ゲッター@Data
、セッター、メソッドequals
、、、を生成しますhashCode
。toString
オブジェクトを不変にするには、 があります@Value
。 @Value
- コンストラクター、ゲッター、メソッドのみを生成しequals
ますhashCode
。toString
また、すべてのフィールドprivate
とも実行しますfinal
。
@Value
public class Cat {
String name;
int age;
Person person;
}
@With
注釈と . は不変クラスとうまく連携します@Builder
。
@With
@Builder
@Value
public class Cat {
String name;
int age;
Person person;
}
不変オブジェクトのフィールドを変更したい場合は、パラメータを 1 つ変更してこのオブジェクトのクローンを作成する必要があります。 @With
- 1 つのフィールドが変更されたオブジェクトのクローンを作成するメソッドをフィールドごとに追加します。
Cat anotherCat = cat.withName("Vasya");
anotherCat
cat
- フィールド値を除き、フィールド値が の値と同じである新しいオブジェクトname
。 @Builder
- チェーンに沿ってオブジェクトを初期化するメソッドを生成します。これは、すべてのパラメーターを持つコンストラクターを使用したくない場合に便利です (クラスが不変の場合、すべてのパラメーターを持つ単一のコンストラクターがあります)。
Cat cat = Cat.builder()
.name("Мурка")
.age(3)
.person(person)
.build();
メソッドの循環呼び出し オブジェクトが双方向通信を行う場合、つまり 相互に参照している場合、これらのメソッドを使用すると エラーが発生toString
します。なぜなら ネストされたオブジェクトのメソッドが循環的に呼び出されます。このコードではエラーが発生します。 equals
hashCode
StackOverflowError
public class Main {
public static void main(String[] args) {
Person person = new Person();
Cat cat = Cat.builder()
.name("Мурка")
.age(3)
.person(person)
.build();
person.setName("Ivan");
person.setAge(26);
person.setCat(cat);
System.out.println(person);
System.out.println(cat);
}
}
この問題の解決策は、メソッドからフィールドを削除して循環呼び出しを中断することです。 @ToString.Exclude
- メソッド内のフィールドを除外します。toString
@EqualsAndHashCode.Exclude
- メソッド内のフィールドを除外しequals
、hashCode
@Value
@With
@Builder
public class Cat {
String name;
int age;
@ToString.Exclude
@EqualsAndHashCode.Exclude
Person person;
}
さらに便利なアノテーションがいくつかあります @Slf4j
- クラスにロガーを追加します @SneakyThrows
- チェックされた例外をチェック解除します
@Slf4j
public class Main {
@SneakyThrows
public static void main(String[] args) {
log.info("start");
Files.readAllBytes(Paths.get(""));
}
}
個別に注釈を付ける 何らかの理由で特定のメソッドのみが必要な場合
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
<h2>結論</h2>これらは単なる基本的な lombok アノテーションですが、最も一般的に使用され、最大の効果があります。コード生成に夢中になりすぎるのもよくありません。<h2>リンク</h2>
GO TO FULL VERSION