|
| 1 | +****** Аннотации в Lombok ****** |
| 2 | + |
| 3 | +Наиболее полезные аннотации в библиотеке: |
| 4 | + |
| 5 | +- @Getter и @Setter — предоставляют геттеры и сеттеры для поля. Могут использоваться как |
| 6 | + на уровне поля, так и на уровне класса. |
| 7 | +- @NoArgsConstructor — используется для создания конструктора без аргументов. |
| 8 | +- @AllArgsConstructor — генерирует параметризованный конструктор, который принимает один |
| 9 | + параметр для каждого поля и инициализирует их с его помощью. Аннотация |
| 10 | + необходима, если нужно создать объект класса, передав начальные |
| 11 | + значения полей в конструктор. |
| 12 | +- @ToString — переопределяет метод toString() и создает для него реализацию по умолчанию. |
| 13 | + Она выводит имя класса и поля по порядку, разделяя их запятыми. Можно пропустить |
| 14 | + отдельные поля, если аннотировать их с помощью @ToString.Exclude. |
| 15 | +- @EqualsAndHashCode — применяется для переопределения методов equals() и hashCode(). |
| 16 | +- @Data — объединяет аннотации @ToString, @Getter, @Setter, @EqualsAndHashCode и |
| 17 | + @RequiredArgsConstructor в одну. Предоставляет весь код, который обычно используется в |
| 18 | + классах моделей, например, геттеры для всех полей, сеттеры для всех нефинальных полей, |
| 19 | + реализацию по умолчанию для toString(), equals() и hashCode(), а также конструктор, |
| 20 | + который инициализирует все поля класса. |
| 21 | +- @NonNull - обработка переменных, которые не должны получать null. |
| 22 | +- @Value - создание неизменяемых классов, аналог Data, но для неизменяемых классов. |
| 23 | +- @Builder - реализация паттерна bulder, @Singular – используется для объектов в единственном |
| 24 | + экземпляре (добавления элемента в коллекции и т.п.). |
| 25 | +ПРИМЕР: |
| 26 | +********************************************************************************************** |
| 27 | +@Builder |
| 28 | +public class Example { |
| 29 | + private String name; |
| 30 | + private int age; |
| 31 | + @Singular |
| 32 | + private Set<String> occupations; |
| 33 | +} |
| 34 | +********************************************************************************************** |
| 35 | + |
| 36 | +- @SneakyThrows - обертка проверяемых исключений. |
| 37 | + |
| 38 | +ПРИМЕР С АННОТАЦИЕЙ: |
| 39 | +********************************************************************************************** |
| 40 | +@SneakyThrows(UnsupportedEncodingException.class) |
| 41 | +public String utf8ToString(byte[] bytes) { |
| 42 | +return new String(bytes, «UTF-8»); |
| 43 | +} |
| 44 | +********************************************************************************************** |
| 45 | + |
| 46 | +ПРИМЕР БЕЗ АННОТАЦИИ: |
| 47 | +********************************************************************************************** |
| 48 | +public String utf8ToString(byte[] bytes) { |
| 49 | + try { |
| 50 | + return new String(bytes, "UTF-8"); |
| 51 | + } catch (UnsupportedEncodingException e) { |
| 52 | + throw Lombok.sneakyThrow(e); |
| 53 | + } |
| 54 | + } |
| 55 | +********************************************************************************************** |
| 56 | + |
| 57 | +- @Synchronized - аннотирование synchronized блоков. |
| 58 | + |
| 59 | +ПРИМЕР С АННОТАЦИЕЙ: |
| 60 | +********************************************************************************************** |
| 61 | +private final Object readLock = new Object(); |
| 62 | + |
| 63 | +@Synchronized |
| 64 | +public static void hello() { |
| 65 | + мой код ...; |
| 66 | + } |
| 67 | + |
| 68 | + @Synchronized |
| 69 | + public int answerToLife() { |
| 70 | + мой код ...; |
| 71 | + } |
| 72 | + |
| 73 | + @Synchronized("readLock") |
| 74 | + public void foo() { |
| 75 | + мой код ...; |
| 76 | + } |
| 77 | +********************************************************************************************** |
| 78 | + |
| 79 | +ПРИМЕР БЕЗ АННОТАЦИИ: |
| 80 | +********************************************************************************************** |
| 81 | +private static final Object $LOCK = new Object[0]; |
| 82 | +private final Object $lock = new Object[0]; |
| 83 | +private final Object readLock = new Object(); |
| 84 | + |
| 85 | +public static void hello() { |
| 86 | + synchronized($LOCK) { |
| 87 | + ...; |
| 88 | + } |
| 89 | +} |
| 90 | + |
| 91 | +public int answerToLife() { |
| 92 | + synchronized($lock) { |
| 93 | + ...; |
| 94 | + } |
| 95 | +} |
| 96 | + |
| 97 | +public void foo() { |
| 98 | + synchronized(readLock) { |
| 99 | + ...; |
| 100 | + } |
| 101 | +} |
| 102 | +********************************************************************************************** |
| 103 | + |
| 104 | +- @Cleanup - простое определение ресурсов, так чтобы они автоматически закрывались после |
| 105 | + окончания работы кода. Альтернатива try-with-resources. |
| 106 | + |
| 107 | +ПРИМЕР С АННОТАЦИЕЙ: |
| 108 | +********************************************************************************************** |
| 109 | +@Cleanup InputStream in = new FileInputStream(args[0]); |
| 110 | +@Cleanup OutputStream out = new FileOutputStream(args[1]); |
| 111 | +...; |
| 112 | +********************************************************************************************** |
| 113 | + |
| 114 | +ПРИМЕР БЕЗ АННОТАЦИИ: |
| 115 | +********************************************************************************************** |
| 116 | + InputStream in = new FileInputStream(args[0]); |
| 117 | + try { |
| 118 | + OutputStream out = new FileOutputStream(args[1]); |
| 119 | + try { |
| 120 | + ...; |
| 121 | + } finally { |
| 122 | + if (out != null) { |
| 123 | + out.close(); |
| 124 | + } |
| 125 | + } |
| 126 | + } finally { |
| 127 | + if (in != null) { |
| 128 | + in.close(); |
| 129 | + } |
| 130 | + } |
| 131 | +********************************************************************************************** |
0 commit comments