JavaRush /Blog Java /Random-PL /Biblioteka Lomboka
Сергей
Poziom 40
Москва

Biblioteka Lomboka

Opublikowano w grupie Random-PL
Biblioteka Lombok zmniejsza ilość napisanego kodu, poprawiając czytelność. Biblioteka Lombok - 1Przykład użycia. Zwykła klasa Personz trzema polami:
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 +
                '}';
    }
}
To samo z Lombokiem
@Data
public class Person {
    private String name;
    private int age;
    private Cat cat;
}
Usunęliśmy część kodu, jednak wszystkie metody i modyfikatory pozostały. Jak to działa. Lombok generuje kod w czasie kompilacji. W czasie wykonywania brakuje samej biblioteki lombok. Jego użycie nie zwiększa rozmiaru programu. Podczas korzystania z Lomboka nasz kod źródłowy nie będzie prawidłowym kodem Java. Dlatego będziesz musiał zainstalować wtyczkę dla IDE, w przeciwnym razie środowisko programistyczne nie zrozumie, z czym ma do czynienia. Lombok obsługuje wszystkie główne IDE Java. Integracja przebiega bezproblemowo. Wszystkie funkcje takie jak „pokaż użycie” i „przejdź do implementacji” nadal działają jak poprzednio, przenosząc Cię do odpowiedniego pola/klasy. Zatem w przypadku prostych klas możesz użyć adnotacji @Data. @Data- generuje konstruktor, gettery, settery, metody equals, hashCode, toString. Aby obiekty były niezmienne, istnieje @Value. @Value- generuje konstruktor, tylko gettery, metody equals, hashCode, toString. A także wszystkie pola privatei final.
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
@WithAdnotacje i .działają dobrze z klasami niezmiennymi @Builder.
@With
@Builder
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
Jeżeli chcemy zmienić pole niezmiennego obiektu, to musimy stworzyć klon tego obiektu z jednym zmienionym parametrem. @With- dodaje dla każdego pola metody tworzące klon obiektu z jednym zmienionym polem.
Cat anotherCat = cat.withName("Wasya");
anotherCat- nowy obiekt, którego wartości pól są takie same jak w przypadku catz wyjątkiem pola name. @Builder- generuje metody, za pomocą których inicjujemy obiekt wzdłuż łańcucha. Jest to wygodne, gdy nie chcemy używać konstruktora ze wszystkimi parametrami (jeśli nasza klasa jest niezmienna, to ma jednego konstruktora ze wszystkimi parametrami).
Cat cat = Cat.builder()
                .name("Мурка")
                .age(3)
                .person(person)
                .build();
Cykliczne wywoływanie metod Jeżeli obiekty posiadają komunikację dwukierunkową, tj. odniesienia do siebie, wówczas użycie metod toStringdoprowadzi equalsdo hashCodebłędu StackOverflowError. Ponieważ nastąpi cykliczne wywołanie metod obiektów zagnieżdżonych. Ten kod spowoduje błąd:
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);
    }
}
Rozwiązaniem problemu jest przerwanie wywołania cyklicznego poprzez usunięcie pola z metody. @ToString.Exclude- Wyklucz pole w metodzie toString @EqualsAndHashCode.Exclude- Wyklucz pole w metodzie equalsihashCode
@Value
@With
@Builder
public class Cat {
    String name;
    int age;
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    Person person;
}
Kilka bardziej przydatnych adnotacji @Slf4j- dodaje rejestrator do klasy @SneakyThrows- powoduje, że zaznaczone wyjątki są odznaczone
@Slf4j
public class Main {

    @SneakyThrows
    public static void main(String[] args) {
        log.info("start");
        Files.readAllBytes(Paths.get(""));
    }
}
Adnotuj indywidualnie Jeśli z jakiegoś powodu potrzebujesz tylko określonych metod
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
Biblioteka Lombok - 2<h2>Wniosek</h2>To tylko podstawowe adnotacje lombok, ale są one najczęściej używane i mają największy efekt. Nie powinieneś też dać się ponieść generowaniu kodu. <h2>Linki</h2>
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION