Геттеры и сеттеры в Lombok

Моя самая любимая функциональность проекта 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)));
    }
}

Скачать код примера

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *