Project lombok это прекраснейший препроцессор аннотаций, который сильно упрощает код и делает java похожей на современный язык.
Подготовка
Библиотеку project lombok надо добавить в classpath проекта (ну и JUnit сотоварищи тоже добавим):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<lombok.version>1.16.6</lombok.version>
<junit.version>4.12</junit.version>
<hamcrest.version>1.3</hamcrest.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>${hamcrest.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
|
Обратите внимание, что артефакт project lombok добавлен со scope «provided», так как он используется только во время компиляции.
Улучшаем java
Для начала определим какую-нибудь сущность, которая будет использоваться в приветствии:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
/**
* Example of entity.
*/
@Builder
public class Entity {
/**
* Some id.
*/
@Getter
@Setter
private Long id;
/**
* Entity name.
*/
@Getter
@Setter
private String name;
/**
* Entity content.
*/
@Getter
@Setter
private BigDecimal amount;
}
|
Лучше всего все новые аннотации продемонстрирует второй класс, который, собственно, и будет приветствовать:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import lombok.experimental.UtilityClass;
import lombok.extern.java.Log;
import lombok.val;
import java.math.BigDecimal;
/**
* Example of lombok annotation usage.
*/
@Log
@UtilityClass
public class HelloLombok {
/**
* Builds sample entity and says 'Hello'.
* @return "10 greetings from Lombok"
*/
public static String greet() {
val entity = Entity.builder()
.id(1L)
.name("Lombok")
.amount(BigDecimal.TEN)
.build();
val result = String.format("%d greetings from %s",
entity.getAmount().intValue(),
entity.getName());
log.info("Resulting string is: " + result);
return result;
}
}
|
Вуаля! У класса Entity автоматически появились геттеры и сеттеры, в классе HelloLombok сам по себе появился интерфейс для логгирования и приватный конструктор.
Проверим, что всё работает как мы задумали:
1
2
3
4
5
6
7
8
9
10
11
|
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running ru.easyjava.java.HelloLombokTest
Oct 19, 2015 8:59:49 PM ru.easyjava.java.HelloLombok greet
INFO: Resulting string is: 10 greetings from Lombok
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.017 sec - in ru.easyjava.java.HelloLombokTest
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
|
Код примера доступен на github.