JavaRush /Java Blog /Random-JA /ロンボク図書館
Сергей
レベル 40
Москва

ロンボク図書館

Random-JA グループに公開済み
Lombok ライブラリにより、記述されるコードの量が削減され、可読性が向上します。 ロンボク島図書館 - 1使用例。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、、、を生成しますhashCodetoStringオブジェクトを不変にするには、 があります@Value@Value- コンストラクター、ゲッター、メソッドのみを生成しequalsますhashCodetoStringまた、すべてのフィールド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");
anotherCatcat- フィールド値を除き、フィールド値が の値と同じである新しいオブジェクトname@Builder- チェーンに沿ってオブジェクトを初期化するメソッドを生成します。これは、すべてのパラメーターを持つコンストラクターを使用したくない場合に便利です (クラスが不変の場合、すべてのパラメーターを持つ単一のコンストラクターがあります)。
Cat cat = Cat.builder()
                .name("Мурка")
                .age(3)
                .person(person)
                .build();
メソッドの循環呼び出し オブジェクトが双方向通信を行う場合、つまり 相互に参照している場合、これらのメソッドを使用すると エラーが発生toStringします。なぜなら ネストされたオブジェクトのメソッドが循環的に呼び出されます。このコードではエラーが発生します。 equalshashCodeStackOverflowError
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- メソッド内のフィールドを除外しequalshashCode
@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
ロンボク図書館 - 2<h2>結論</h2>これらは単なる基本的な lombok アノテーションですが、最も一般的に使用され、最大の効果があります。コード生成に夢中になりすぎるのもよくありません。<h2>リンク</h2>
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION