HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В Java разработчики часто сталкиваются с необходимостью написания повторяющегося шаблонного кода. К таким элементам относятся конструкторы, геттеры и сеттеры. Это может приводить к значительному увеличению объема кода, особенно в больших проектах.</p>
1 <p>В Java разработчики часто сталкиваются с необходимостью написания повторяющегося шаблонного кода. К таким элементам относятся конструкторы, геттеры и сеттеры. Это может приводить к значительному увеличению объема кода, особенно в больших проектах.</p>
2 <p>Рассмотрим класс Post. Он содержит пять полей, включающих стандартные конструкторы и методы доступа. Это типичный пример шаблонного кода, который встречается во многих классах.</p>
2 <p>Рассмотрим класс Post. Он содержит пять полей, включающих стандартные конструкторы и методы доступа. Это типичный пример шаблонного кода, который встречается во многих классах.</p>
3 <p>Мы еще не написали ничего полезного, но класс уже занимает больше 70 строк. А что будет когда у нас будет 20 полей или 30? Для прикладного кода это вполне нормально. При этом самих классов сотни и тысячи. Некоторых разработчиков такая ситуация устраивает, так как редактор сам генерирует весь нужный код, но некоторые все равно хотели бы избавиться от шаблонного кода и даже не генерировать его.</p>
3 <p>Мы еще не написали ничего полезного, но класс уже занимает больше 70 строк. А что будет когда у нас будет 20 полей или 30? Для прикладного кода это вполне нормально. При этом самих классов сотни и тысячи. Некоторых разработчиков такая ситуация устраивает, так как редактор сам генерирует весь нужный код, но некоторые все равно хотели бы избавиться от шаблонного кода и даже не генерировать его.</p>
4 <h2>Решение с Lombok</h2>
4 <h2>Решение с Lombok</h2>
5 <p>Сама Java не позволяет так сделать, но позволяет<a>Lombok</a>. Lombok - это библиотека, которая позволяет убрать шаблонный код при создании классов. Возьмем класс из примера выше и перепишем его с использованием Lombok. Вот что у нас получится.</p>
5 <p>Сама Java не позволяет так сделать, но позволяет<a>Lombok</a>. Lombok - это библиотека, которая позволяет убрать шаблонный код при создании классов. Возьмем класс из примера выше и перепишем его с использованием Lombok. Вот что у нас получится.</p>
6 <p>Размер класса сократился до примерно 10 строк, хотя то что мы получили - это всего лишь визуальное сокращение кода. Во время исполнения этот код будет заменен на обычный класс Java со всеми нужными методами.</p>
6 <p>Размер класса сократился до примерно 10 строк, хотя то что мы получили - это всего лишь визуальное сокращение кода. Во время исполнения этот код будет заменен на обычный класс Java со всеми нужными методами.</p>
7 <p>Самое необычное в коде выше это блок кода над классом:</p>
7 <p>Самое необычное в коде выше это блок кода над классом:</p>
8 <p>То, что мы здесь видим, называется аннотациями. Аннотации в Java это тоже код. Они начинаются с символа<em>@</em>за которым идет имя аннотации. Аннотации могут сопровождаться параметрами в стиле, похожем на вызов функций.</p>
8 <p>То, что мы здесь видим, называется аннотациями. Аннотации в Java это тоже код. Они начинаются с символа<em>@</em>за которым идет имя аннотации. Аннотации могут сопровождаться параметрами в стиле, похожем на вызов функций.</p>
9 <p>То что мы увидели выше, называется аннотациями класса. Встречаются и другие аннотации, привязанные к свойствам, методам и даже параметрам методов. Со временем мы разберемся со всеми видами и будем их активно использовать в своем коде не только в связке с Lombok.</p>
9 <p>То что мы увидели выше, называется аннотациями класса. Встречаются и другие аннотации, привязанные к свойствам, методам и даже параметрам методов. Со временем мы разберемся со всеми видами и будем их активно использовать в своем коде не только в связке с Lombok.</p>
10 <p>Сами по себе аннотации на код никак не влияют. Аннотации лишь добавляют информацию к классу, которую затем может прочитать и использовать другой код. В нашем случае это будет делать плагин Lombok для Gradle, который подключается к проекту таким образом:</p>
10 <p>Сами по себе аннотации на код никак не влияют. Аннотации лишь добавляют информацию к классу, которую затем может прочитать и использовать другой код. В нашем случае это будет делать плагин Lombok для Gradle, который подключается к проекту таким образом:</p>
11 <p>Lombok встраивается в процесс компиляции, во время которой он "наполняет" классы необходимыми методами. Из-за этого, помимо gradle-плагина, для поддержки Lombok понадобится добавить плагин в используемый редактор. Подробнее установка Lombok описана на<a>официальном сайте</a>.</p>
11 <p>Lombok встраивается в процесс компиляции, во время которой он "наполняет" классы необходимыми методами. Из-за этого, помимо gradle-плагина, для поддержки Lombok понадобится добавить плагин в используемый редактор. Подробнее установка Lombok описана на<a>официальном сайте</a>.</p>
12 <p>За что отвечает каждая аннотация выше?</p>
12 <p>За что отвечает каждая аннотация выше?</p>
13 <ul><li>@Getter: Генерирует стандартные геттеры для всех полей класса.</li>
13 <ul><li>@Getter: Генерирует стандартные геттеры для всех полей класса.</li>
14 <li>@Setter: Генерирует стандартные сеттеры для всех полей класса.</li>
14 <li>@Setter: Генерирует стандартные сеттеры для всех полей класса.</li>
15 <li>@NoArgsConstructor: Генерирует пустой конструктор. Используется только тогда, когда определен хотя бы один не пустой конструктор.</li>
15 <li>@NoArgsConstructor: Генерирует пустой конструктор. Используется только тогда, когда определен хотя бы один не пустой конструктор.</li>
16 <li>@AllArgsConstructor: Генерирует конструктор со всеми полями. Поля в конструкторе перечислены в том же порядке, в котором они определены в классе.</li>
16 <li>@AllArgsConstructor: Генерирует конструктор со всеми полями. Поля в конструкторе перечислены в том же порядке, в котором они определены в классе.</li>
17 </ul><h2>@ToString</h2>
17 </ul><h2>@ToString</h2>
18 <p>@toString еще одна полезная аннотация, которая генерирует метод toString() добавляя в него все не статические поля класса.</p>
18 <p>@toString еще одна полезная аннотация, которая генерирует метод toString() добавляя в него все не статические поля класса.</p>
19 <p>Использование и вывод:</p>
19 <p>Использование и вывод:</p>
20 <h2>@EqualsAndHashCode</h2>
20 <h2>@EqualsAndHashCode</h2>
21 <p>Аннотация @EqualsAndHashCode генерирует методы equals() и hashCode() соответственно. По умолчанию, в эти методы включаются все не статические поля класса. Пример с пользователем.</p>
21 <p>Аннотация @EqualsAndHashCode генерирует методы equals() и hashCode() соответственно. По умолчанию, в эти методы включаются все не статические поля класса. Пример с пользователем.</p>
22 <p>Использование:</p>
22 <p>Использование:</p>
23 <p>Если поведение необходимо изменить, то @EqualsAndHashCode позволяет это сделать описав те поля, которые нужно явно включить или исключить. Предположим что мы хотим сравнивать пользователей только на основе email, тогда код примет следующий вид:</p>
23 <p>Если поведение необходимо изменить, то @EqualsAndHashCode позволяет это сделать описав те поля, которые нужно явно включить или исключить. Предположим что мы хотим сравнивать пользователей только на основе email, тогда код примет следующий вид:</p>
24  
24