суббота, 24 сентября 2011 г.

Lombok: @Getter and @Setter annotations

При написании Java Beans-ов постоянно приходится совершать одно и тоже действие — добавлять getter-ы и setter-ы для полей. Кто-то делает это вручную. Кто-то создаёт их автоматически с помощью IDE. В этом посте речь пойдёт об их генерации на основе аннотаций.


Представляю вашему вниманию Lombok Project. В его основе лежит простая идея: при описании полей, просто добавьте аннотации @Getter и/или @Setter и при компиляции будут автоматически сгенерированы соответствующие методы.

В проекте, использующем Maven необходимо добавить библиотеку в зависимости:
<dependency>
<groupid>org.projectlombok</groupId>
<artifactid>lombok</artifactId>
<version>0.10.8</version>
<scope>provided</scope>
</dependency>
view raw pom.xml hosted with ❤ by GitHub

Область видимости выставлена в provided, чтобы библиотека не попадала в JAR/WAR файл приложения, т.к. при использовании @Getter/@Setter аннотаций она необходима только на стадии компиляции.

Ниже простой пример:

import lombok.Getter;
import lombok.Setter;
public class Example {
@Getter @Setter
private int a;
}


В результате Lombok сгенерит для вас примерно следующий код:

import lombok.Getter;
import lombok.Setter;
public class Example {
private int a;
public int getA() {
return this.a;
}
public void setA(int a) {
this.a = a;
}
}


Удобно? Как по мне, то да :)

Выше я написал, что Lombok сгенерит для вас примерно такой код, т.е. похожий, но всё-таки не такой. А что же будет на самом деле? Давайте заглянем под капот и сами посмотрим:

$ java -jar lombok-0.10.0.jar delombok -p Example.java
// Generated by delombok at Sat Sep 24 17:04:52 NOVST 2011
public class Example {
private int a;
@java.lang.SuppressWarnings("all")
public int getA() {
return this.a;
}
@java.lang.SuppressWarnings("all")
public void setA(final int a) {
this.a = a;
}
}
view raw DelombokExample hosted with ❤ by GitHub


Здесь мы используем Delombok для того, чтобы посмотреть на результирующий код. Также мы можем с помощью Delombok-а конвертировать код, написанный с применением Lombok-аннотаций в обычный Java код.

По умолчанию, Lombok создаёт открытые методы (т.е. с модификатором public). Вы также можете попросить его создать методы с любой другой областью видимости, указав необходимый AccessLevel:

@Getter(AccessLevel.PROTECTED)
private int b;


Справедливости ради также приведу несколько отрицательных сторон использования этой библиотеки:

  • можно запутаться при отладке, т.к. компилятор работает со сгенерированным кодом, а вы с исходным
  • не все IDE могут поддерживать автодополнение методов, созданных Lombok-ом. В случае использования Eclipse, с этим проблем быть не должно, достаточно только установить JAR-файл Lombok-а
  • некоторые верификаторы кода, которые анализируют исходный код, например, CheckStyle, могут рапортовать вам об ошибках, которых на самом деле нет, т.к. они не берут в рассчет аннотации Lombok-а (Здесь может помочь delomok и специальный Maven плагин, но сходу его настроить у меня не вышло.)

Замечу, что это отнюдь не все фишки, которые предоставляет Lombok, я лишь рассказал о самой, на мой взгляд, популярной.

Комментариев нет:

Отправить комментарий