Die Lombok-Bibliothek reduziert die Menge des geschriebenen Codes und verbessert so die Lesbarkeit. Anwendungsbeispiel. Eine reguläre Klasse
Person
mit 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 private
und final
.
@Value
public class Cat {
String name;
int age;
Person person;
}
@With
Anmerkungen 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 cat
bis 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 toString
zu equals
einem hashCode
Fehler 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 equals
undhashCode
@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
<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>
GO TO FULL VERSION