HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: java, программирование на java, разработка на java, библиотека, lombok</p>
1 <p>Теги: java, программирование на java, разработка на java, библиотека, lombok</p>
2 <p>Рассмотрим полезную<strong>библиотеку Lombok</strong>. Давайте представим, что у нас есть самый обычный класс на Java: - два поля; - конструктор; - геттеры и сеттеры; - переопределены методы equals и hashCode; - toString для отладки; - и мы решили реализовать паттерн<strong>builder</strong>.</p>
2 <p>Рассмотрим полезную<strong>библиотеку Lombok</strong>. Давайте представим, что у нас есть самый обычный класс на Java: - два поля; - конструктор; - геттеры и сеттеры; - переопределены методы equals и hashCode; - toString для отладки; - и мы решили реализовать паттерн<strong>builder</strong>.</p>
3 package ru.otus; import java.util.Objects; public class Person { private final String firstName; private final String lastName; public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public static PersonBuilder builder() { return new PersonBuilder(); } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(firstName, person.firstName) &amp;&amp; Objects.equals(lastName, person.lastName); } @Override public int hashCode() { return Objects.hash(firstName, lastName); } @Override public String toString() { return "Person{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + '}'; } public static class PersonBuilder { private String firstName; private String lastName; PersonBuilder() { } public PersonBuilder firstName(String firstName) { this.firstName = firstName; return this; } public PersonBuilder lastName(String lastName) { this.lastName = lastName; return this; } public Person build() { return new Person(firstName, lastName); } public String toString() { return "Person.PersonBuilder(firstName=" + this.firstName + ", lastName=" + this.lastName + ")"; } } }<p>Весь код занимает ~80 строк, хотя у нас всего два поля и шаблонный код для них. К счастью, есть библиотека<strong>Lombok</strong>, которая позволяет решить проблему.</p>
3 package ru.otus; import java.util.Objects; public class Person { private final String firstName; private final String lastName; public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public static PersonBuilder builder() { return new PersonBuilder(); } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(firstName, person.firstName) &amp;&amp; Objects.equals(lastName, person.lastName); } @Override public int hashCode() { return Objects.hash(firstName, lastName); } @Override public String toString() { return "Person{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + '}'; } public static class PersonBuilder { private String firstName; private String lastName; PersonBuilder() { } public PersonBuilder firstName(String firstName) { this.firstName = firstName; return this; } public PersonBuilder lastName(String lastName) { this.lastName = lastName; return this; } public Person build() { return new Person(firstName, lastName); } public String toString() { return "Person.PersonBuilder(firstName=" + this.firstName + ", lastName=" + this.lastName + ")"; } } }<p>Весь код занимает ~80 строк, хотя у нас всего два поля и шаблонный код для них. К счастью, есть библиотека<strong>Lombok</strong>, которая позволяет решить проблему.</p>
4 <p>Lombok предлагает<strong>декларативный подход</strong>к удалению<strong>boilerplate</strong>на основе аннотаций:</p>
4 <p>Lombok предлагает<strong>декларативный подход</strong>к удалению<strong>boilerplate</strong>на основе аннотаций:</p>
5 package ru.otus; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; @Getter @ToString @EqualsAndHashCode @RequiredArgsConstructor @Builder public class Person { private final String firstName; private final String lastName; }<p>Аннотации даже не нуждаются в пояснении. И так понятно, какой код каждая аннотация генерирует на этапе компиляции. Думаете, 5 аннотаций вместо 80 строк кода, - это всё?</p>
5 package ru.otus; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; @Getter @ToString @EqualsAndHashCode @RequiredArgsConstructor @Builder public class Person { private final String firstName; private final String lastName; }<p>Аннотации даже не нуждаются в пояснении. И так понятно, какой код каждая аннотация генерирует на этапе компиляции. Думаете, 5 аннотаций вместо 80 строк кода, - это всё?</p>
6 <p>Нет, мы можем заменить и эти аннотации одной - @Data.</p>
6 <p>Нет, мы можем заменить и эти аннотации одной - @Data.</p>
7 package ru.otus; import lombok.Builder; import lombok.Data; @Data @Builder public class Person { private final String firstName; private final String lastName; }<p>Lombok предоставляет ещё много других полезных возможностей. Но подробнее об этом лучше посмотреть на официальном<a>сайте</a>.</p>
7 package ru.otus; import lombok.Builder; import lombok.Data; @Data @Builder public class Person { private final String firstName; private final String lastName; }<p>Lombok предоставляет ещё много других полезных возможностей. Но подробнее об этом лучше посмотреть на официальном<a>сайте</a>.</p>
8 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
8 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
9  
9