Моя самая любимая функциональность проекта lombok — генерация геттеров и сеттеров. Наконец-то java разработчики избавляются от тяжёлого наследия и сбрасывают с себя цепи.
Генерируют геттеры и сеттеры аннотации @Getter и @Setter:
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
|
/**
* Sample user entity
*/
public class User {
/**
* Id.
*/
@Getter
@Setter
private Long id;
/**
* User name.
*/
@Getter
@Setter
private String name;
/**
* Some entity, that you can't set.
*/
@Getter
@Setter(AccessLevel.PRIVATE)
private BigDecimal cantSet = BigDecimal.TEN;
}
|
Параметром аннотации можно задать уровень доступа к сгенерированному методу. В примере выше сеттер для переменной cantSet будет недоступен:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Test
public void testClientProperties() {
User testedObject = new User();
testedObject.setId(1L);
testedObject.setName("TEST");
/**
* Line below will not compile.
*/
//testedObject.setCantSet(BigDecimal.ONE)
assertThat(testedObject.getId(), is(1L));
assertThat(testedObject.getName(), is("TEST"));
assertThat(testedObject.getCantSet(), is(BigDecimal.TEN));
}
|
Поместив в код проекта файл lombok.config c опцией lombok.accessors.chain = true можно автоматически сгенерировать сеттеры, которые возвращают this вместо void и вызывать их в стиле билдера:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class Account {
/**
* Id.
*/
@Getter
@Setter
private Long id;
/**
* Account owner.
*/
@NonNull
@Getter
@Setter
private User owner;
/**
* Account's value.
*/
@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
|
@Test
public void testChainedSetters() {
User user = new User();
/**
* This line will not compile.
*/
//user.setId(1L).setName("TEST");
user.setId(1L);
user.setName("TEST");
Account testedObject = new Account();
testedObject
.setId(1L)
.setOwner(user)
.setAmount(BigDecimal.ONE);
assertThat(testedObject.getId(), is(1L));
assertThat(testedObject.getOwner(), is(user));
assertThat(testedObject.getAmount(), is(BigDecimal.ONE));
}
|
Действие конфигурационного файла распространяется на каталог исходников, в котором он расположен и все его подкаталоги.
Аннотация @NonNull на переменной owner указывает project lombok, что сеттер не должен принимать null значения:
1
2
3
4
5
6
7
8
|
@Test(expected = NullPointerException.class)
public void cantSetNullOwner() {
Account testedObject = new Account();
testedObject
.setId(1L)
.setOwner(null)
.setAmount(BigDecimal.ONE);
}
|
Последний и, на мой взгляд, достаточно сомнительный функционал lombok по генерации геттеров — кэширование значений. Если переменная имеет некоторое значение и это значение дорого вычислять, то lombok может сгенерировать геттер, который закэширует результат вычислений и будет возвращать его из кэша:
1
2
3
4
5
6
7
8
9
10
11
|
@Getter(lazy = true)
private final BigDecimal factorial16 = factorial(new BigDecimal(16));
private BigDecimal factorial(BigDecimal current) {
if (current.equals(BigDecimal.ZERO)) {
return BigDecimal.ONE;
}
return current.multiply(
factorial(
current.subtract(BigDecimal.ONE)));
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class Factorial16UtilTest {
private Factorial16Util testedObject = new Factorial16Util();
public void testFirstCall() {
assertThat(testedObject.getFactorial16(), is(new BigDecimal(20922789888000L)));
}
@Test(timeout = 1L)
public void testSecondCall() {
assertThat(testedObject.getFactorial16(), is(new BigDecimal(20922789888000L)));
}
}
|
Код примера доступен на github.