Статьи

Lombok, препроцессор Java-аннотаций во время компиляции для минимизации размера кода

В этой статье мы рассмотрим, как мы можем использовать lombok внутри нашего обычного Java-кода, чтобы минимизировать длину и избыточность кода.

Что такое ломбок?

Lombok, препроцессор аннотации времени компиляции, который помогает внедрить некоторый код во время компиляции. Прежде чем идти в деталях, прошу вас посмотреть видео с их сайта . Я не собираюсь показывать демо, как это, но я покажу, как мы можем использовать это внутри проекта (включая жизненный цикл Maven).

Давайте начнем с базового понимания. Как я уже сказал, lombok — это препроцессор аннотации времени компиляции. Что это значит?

-> это будет работать во время компиляции (мы видим эффект во время написания кода)
-> нам нужны зависимости в пути к классам во время компиляции (с выполнением команды javac)
-> Нам нужна поддержка плагинов, чтобы увидеть эффект в IDE во время кодирования. (Как IDE компилируется во время кодирования / сохранения)

Ломбок имеет несколько утилит / функций. Мы рассмотрим основные из них, которые я использовал до сих пор.

Примечание: чтобы узнать об аннотации, вы можете увидеть мой этот пост.

Установка :

Eclipse: Загрузите по этой ссылке , установите его (вам нужно показать каталог установки eclipse)

shantonu_Selection_050

shantonu_Selection_051

(Я проверил версию STS / eclipse: 3.7.3.RELEASE)

Intellij IDEA: Просто установите плагины lombok. (Файл -> Настройки -> Плагины -> Поиск / просмотр, затем установка)

Или: ссылка на плагин

Теперь: основываясь на поведении IDE, вам может понадобиться включить препроцессор аннотаций, чтобы плагины работали. (обычно современные IDE имеют это значение по умолчанию)

Из Затмения:

shantonu_Selection_058

IntelliJ IDEA:

shantonu_Selection_057

Настройка проекта:

Я буду использовать Maven (вы можете использовать gradle таким же образом). Моя версия Maven 3.3.9.

Шаг 1: в pom.xml добавьте зависимость

1
2
3
4
5
6
7
dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.8</version>
    </dependency>
</dependencies>

Вы можете получить обновленную версию от Maven Central .

Шаг 2: Как мы видим, lombok — это препроцессор времени компиляции, поэтому нам нужен компилятор. Итак, добавление подключаемого модуля компилятора maven внутри сборки -> plugins-> plugin

1
2
3
4
5
6
7
8
9
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <compilerVersion>1.8</compilerVersion>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
</plugin>

Как видите, я определил исходную и целевую версию до 1.8.

Шаг 3: Теперь нам нужно добавить плагин lombok для работы во время компиляции проекта. Для этого нам нужно войти в плагин Управление и добавить плагин с параметрами в разделе сборки.

1
2
3
4
5
6
7
8
9
<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-maven-plugin</artifactId>
            <version>1.16.8.0</version>
        </plugin>
    </plugins>
</pluginManagement>

добавление плагина с параметром

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<plugin>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-maven-plugin</artifactId>
    <version>1.16.8.0</version>
    <configuration>
        <encoding>UTF-8</encoding>
    </configuration>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>testDelombok</goal>
                <goal>delombok</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Пространственное примечание здесь:

1. Кодирование необходимо
2. Вы можете видеть, что я использую 2 цели , это пространственные цели, определенные для lombok для определения области тестирования и источника. Я использую оба, так как мой тестовый код также нуждается в ломбок.

Итак, мой раздел Build стал этим.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-maven-plugin</artifactId>
                <version>1.16.8.0</version>
            </plugin>
        </plugins>
    </pluginManagement>
 
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <compilerVersion>1.8</compilerVersion>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-maven-plugin</artifactId>
            <version>1.16.8.0</version>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>testDelombok</goal>
                        <goal>delombok</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

И для ведения журнала нам нужны зависимости. Я добавлю весь тип журнала пример. Таким образом, сложив их все вместе

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!--Logging external dependencies--><dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
 
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.21</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-ext</artifactId>
    <version>1.7.21</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.5</version>
</dependency>

Итак, наконец, мой раздел сборки POM выглядит следующим образом .

Теперь пришло время увидеть каждую функцию.

Примечание: и для eclipse, и для IntelliJ я использую Outline View для просмотра эффектов. Чтобы включить схему:

Затмение: Окно -> Показать представление -> Схема

IntelliJ: Вид -> Кнопки инструментов, вы будете структурировать.

@Getter @Setter: помогает установить метод получения с помощью переменной. Он также поддерживает параметры уровня доступа для определения областей действия получателей и установщиков.

Параметр: принимает параметр Enum AccessLevel
ПУБЛИЧНО = Публично доступно
MODULE, PACKAGE = то же, что по умолчанию (без использования модификатора)
ЗАЩИЩЕННЫЙ = такой же, как защищенный
ЧАСТНЫЙ = такой же, как частный
НЕТ = не будет реализации

shantonu_Selection_054

На уровне класса:
shantonu_Selection_055
Преобладающий получатель уровня класса:
shantonu_Selection_056
@ToString: это реализация toString (), которую мы можем использовать только для уровня класса.

Параметры:

includeFieldNames (): логический тип => определить включение всех полей
callSuper (): логический тип => вызов супер
doNotUseGetters (): boolean type => избегать использования получателей полей.
exclude (): строковый массив имен полей => определить исключение полей
of (): массив строк с именами полей => определяет, какие из них будут добавлены (явно)

shantonu_Selection_059

@Data: это комбинация нескольких аннотаций.
Где: мы можем использовать перед классом / типом

Параметры:

Примечание: данные состоят из
1. @Getter,
2. @ Сеттер.
3. @RequiredArgsConstructor
4. @Tostring
5. @EqualsAndHashCode

Пример :

Затмение:
shantonu_Selection_052

IntelliJ:

shantonu_Selection_053

@Value: это просто тип неизменяемого значения @Data.

Параметр: запись staticConstructor сделает конструктор по умолчанию закрытым

shantonu_Selection_070

@Builder: добавление класса по умолчанию для вашего класса. Это просто конструктор (например, шаблон компоновщика с параметрами, см. Пример на рисунке)

@Singular: для уведомления о коллекции (поддерживает только guava и java util). Включает 2 метода сумматора: одно добавление, добавление всех.
shantonu_Selection_069

val: Это делает локальную конечную переменную (внутри метода)

(сразу после this () или super () вызывается)

Использования:

1. Используйте как var (js / c #), он будет действовать как окончательный

2. Внутри каждого цикла.

1
public class ValExample {
01
02
03
04
05
06
07
08
09
10
11
12
13
val items;
    public void  aMethod() {
        val store = new Hashtable<String, String>();
        store.put("one", new String("Shantonu"));
        val func = store.get("one");
        System.out.println(func.toLowerCase());
        store.put("two", "Andrii");
        store.put("three", "Oleks");
        for(val v: store.entrySet()){
            System.out.println("KEY =" +v.getKey()+", VAL = "+ v.getValue());
        }
    }
}

shantonu_Selection_069
@NotNull: это добавит нулевую проверку переменной и вызовет исключение нулевого указателя.

Область применения: метод, параметр, локальная переменная

Без проверки
shantonu_Selection_065

с @NotNull

shantonu_Selection_066

@EqualsAndHashCode: просто добавляет equals (Object other) и hashCode () в класс. (так что это аннотация на уровне класса).

Он поддерживает параметры для настройки этих методов равенства и хэш-кода. Все параметры такие же, как у @ToString.

shantonu_Selection_071

@Cleanup: это простой способ очистить ресурсы. Это фактически гарантирует, что метод close () ресурсов будет вызван в блоке finally.

Только локальная переменная:

Вызов метода close для ресурсов. если у вас есть другое имя метода, то для вызова вам нужно value = thatMehtodName (например, выход)

Вы можете увидеть простой пример здесь . Не нужно пытаться поймать.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public class CleanupEx {
 
    public static void main(String[] args) throws IOException {
        String pom = System.getProperty("user.dir") + "/pom.xml";
        String io  = System.getProperty("user.dir") + "/logs/io.txt";
        @Cleanup InputStream in = new FileInputStream(pom);
        @Cleanup OutputStream out = new FileOutputStream(io);
        int reading;
        char c;
        while ((reading=in.read())!=-1){
            c=(char)reading;
            out.write(c);
        }
        out.flush();
    }
}

Примечание. По моему мнению, это удобно, если вы не заботитесь об управлении ресурсами. Если вам нравится использовать свои ресурсы по логике, лучше избегайте этого. Пример использования многопоточных ресурсов.

Вход с использованием ломбок:

@log: это одна из лучших полезных функций. На этой картинке показаны все логгеры для сбора. Мой пример в github показывает детали.

Нам нужно установить log перед классом, вот и все. Он предоставит журнал статических переменных, и мы можем использовать его в зависимости от того, какой тип журнала мы используем.

Параметр: в качестве параметра берется тема, по умолчанию это имя класса. мы можем установить тему журнала.

Примечание: для разных реализаций журнала нам нужен другой тип конфигурации. Lombok не предоставляет никакой помощи по настройке, он просто внедряет код. Итак, нам нужно добавить, зависит от того, какой тип журнала я добавляю.

Мой пример в github содержит все 6 типов конфигураций журналов. Смотрите файл pom внимательно, чтобы узнать зависимости, а также ресурсы для файлов конфигурации.

shantonu_Selection_060

Ссылка на GitHub примеров Lombok : https://github.com/sarkershantonu/practice-projects/tree/master/lombok-examples

Примечание: есть гораздо больше обычных и экспериментальных функций, которые я пропустил из-за отсутствия объема моих тестов (пространственно @Synchronized). Я добавлю еще один за другим в репозиторий github и добавлю здесь ссылки на ссылки.