JavaRush /Java-Blog /Random-DE /Lombok-Bibliothek
Сергей
Level 40
Москва

Lombok-Bibliothek

Veröffentlicht in der Gruppe Random-DE
Die Lombok-Bibliothek reduziert die Menge des geschriebenen Codes und verbessert so die Lesbarkeit. Lombok-Bibliothek – 1Anwendungsbeispiel. Eine reguläre Klasse Personmit drei Feldern:
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 +
                '}';
    }
}
Das Gleiche gilt für Lombok
@Data
public class Person {
    private String name;
    private int age;
    private Cat cat;
}
Wir haben eine Menge Code entfernt, alle Methoden und Modifikatoren sind jedoch geblieben. Wie es funktioniert. Lombok generiert Code zur Kompilierungszeit. Die Lombok-Bibliothek selbst fehlt zur Laufzeit. Durch die Verwendung wird die Größe des Programms nicht erhöht. Bei Verwendung von Lombok ist unser Quellcode kein gültiger Java-Code. Daher müssen Sie ein Plugin für die IDE installieren, da die Entwicklungsumgebung sonst nicht versteht, womit sie es zu tun hat. Lombok unterstützt alle wichtigen Java-IDEs. Die Integration ist nahtlos. Alle Funktionen wie „Verwendung anzeigen“ und „Zur Implementierung gehen“ funktionieren weiterhin wie bisher und führen Sie zum entsprechenden Feld/zur entsprechenden Klasse. Für einfache Klassen können Sie also die Annotation verwenden @Data. @Data- generiert Konstruktor, Getter, Setter, Methoden equals, hashCode, toString. Um Objekte unveränderlich zu machen, gibt es @Value. @Value- generiert den Konstruktor, nur Getter, Methoden equals, hashCode, toString. Und erledigt auch alle Felder privateund final.
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
@WithAnmerkungen und funktionieren gut mit unveränderlichen Klassen @Builder.
@With
@Builder
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
Wenn wir das Feld eines unveränderlichen Objekts ändern möchten, müssen wir einen Klon dieses Objekts mit einem geänderten Parameter erstellen. @With– Fügt Methoden für jedes Feld hinzu, die einen Klon des Objekts mit einem geänderten Feld erstellen.
Cat anotherCat = cat.withName(„Wasja“);
anotherCat- ein neues Objekt, dessen Feldwerte catbis auf das Feld mit denen von identisch sind name. @Builder- generiert Methoden, mit denen wir ein Objekt entlang einer Kette initialisieren. Dies ist praktisch, wenn wir keinen Konstruktor mit allen Parametern verwenden möchten (Wenn unsere Klasse unveränderlich ist, verfügt sie über einen einzigen Konstruktor mit allen Parametern).
Cat cat = Cat.builder()
                .name("Мурка")
                .age(3)
                .person(person)
                .build();
Zyklischer Methodenaufruf Wenn Objekte bidirektional kommunizieren, d.h. Verweise aufeinander, dann führt die Verwendung der Methoden toStringzu equalseinem hashCodeFehler StackOverflowError. Weil Es erfolgt ein zyklischer Aufruf von Methoden verschachtelter Objekte. Dieser Code führt zu einem Fehler:
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("Iwan");
        person.setAge(26);
        person.setCat(cat);

        System.out.println(person);
        System.out.println(cat);
    }
}
Die Lösung des Problems besteht darin, den zyklischen Aufruf zu unterbrechen, indem das Feld aus der Methode entfernt wird. @ToString.Exclude- Ein Feld in einer Methode ausschließen toString @EqualsAndHashCode.Exclude- Ein Feld in einer Methode ausschließen equalsundhashCode
@Value
@With
@Builder
public class Cat {
    String name;
    int age;
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    Person person;
}
Ein paar weitere nützliche Anmerkungen @Slf4j– fügt der Klasse einen Logger hinzu @SneakyThrows– macht aktivierte Ausnahmen deaktiviert
@Slf4j
public class Main {

    @SneakyThrows
    public static void main(String[] args) {
        log.info("start");
        Files.readAllBytes(Paths.get(""));
    }
}
Kommentieren Sie individuell , wenn Sie aus irgendeinem Grund nur bestimmte Methoden benötigen
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
Lombok-Bibliothek – 2<h2>Fazit</h2>Dies sind nur die grundlegenden Lombok-Anmerkungen, aber sie werden am häufigsten verwendet und haben die größte Wirkung. Auch bei der Codegenerierung sollte man sich nicht zu sehr hinreißen lassen. <h2>Links</h2>
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION