Моя самая любимая функциональность проекта lombok — генерация геттеров и сеттеров. Наконец-то java разработчики избавляются от тяжёлого наследия и сбрасывают с себя цепи.
Генерируют геттеры и сеттеры аннотации @Getter и @Setter:
/** * 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 будет недоступен:
@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 и вызывать их в стиле билдера:
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; }
@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 значения:
@Test(expected = NullPointerException.class) public void cantSetNullOwner() { Account testedObject = new Account(); testedObject .setId(1L) .setOwner(null) .setAmount(BigDecimal.ONE); }
Последний и, на мой взгляд, достаточно сомнительный функционал lombok по генерации геттеров — кэширование значений. Если переменная имеет некоторое значение и это значение дорого вычислять, то lombok может сгенерировать геттер, который закэширует результат вычислений и будет возвращать его из кэша:
@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))); }
@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))); } }