
Lombok — проект по добавлению дополнительной функциональности в Java c помощью изменения исходного кода перед Java компиляцией.
По сути, проект Lombok позволяет избавиться от многословности Java в большинстве случаев и перестать писать огромные простыни кода из гетеров, сеттеров, equals, hashcode и toString (да их обычно генерит IDE, но читать и менять все равно приходится программисту), в результате Java становиться почти такой же краткой как Kotlin, Scala или C#.
Что особенно радует, Lombok очень прост и легок в добавлении к вашему проекту. Если вам, как и мне, нравится принцип KISS, то советую посмотреть на Lombok.
Так же рекомендую, посмотреть на другие статьи цикла, например последную шпаргалку по Java SE8
Добавление в проекты очень простое, достаточно добавить обычные зависимости:
Подробнее...
Maven:
Так же можно (но не обязательно добавить плагин для работы статических компиляторов, если нужно анализировать код после компиляции Lombok), см. тут
Gradle
Так же есть плагины для Idea, Eclipse и т.п. Если вы собираете Gradle или Maven, то собираться будет и без этих плагинов, но будут Idea/Eclipse возможно будут показывать ошибки при анализе кода.
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency>
Так же можно (но не обязательно добавить плагин для работы статических компиляторов, если нужно анализировать код после компиляции Lombok), см. тут
Gradle
plugins { id 'net.ltgt.apt' version '0.10' } dependencies { compileOnly 'org.projectlombok:lombok:1.16.18' apt "org.projectlombok:lombok:1.16.18" }
Так же есть плагины для Idea, Eclipse и т.п. Если вы собираете Gradle или Maven, то собираться будет и без этих плагинов, но будут Idea/Eclipse возможно будут показывать ошибки при анализе кода.
Команды и аннотации:
Таблица
| Название | Описание | Пример Lombok |
Пример обычной Java |
|---|---|---|---|
@NonNull |
обработка переменных, которые не должны получать null |
|
|
@Getter / |
легкое создание getter’ов и setter’ов |
|
|
@ToString |
определение аннотации перед классом, для реализации стандартного toString метода |
|
|
@EqualsAndHashCode |
легкое создание методов Equals и HashCode |
|
|
@NoArgsConstructor, |
создания пустого конструктора, конструктора включающего все final поля, либо конструктора включающего все возможные поля |
|
|
@Data |
генерация всех служебных методов, заменяет сразу команды @ToString, @EqualsAndHashCode, Getter, Setter, @RequiredArgsConstructor |
|
Много кода
|
@Value |
создание неизменяемых классов, аналог Data, но для неизменяемых классов |
|
Много кода
|
@Builder |
реализация паттерна bulder, Singular – используется для объектов в единственном экземпляре (добавления элемента в коллекции и т.п.) |
|
много кода
|
@SneakyThrows |
обертка проверяемых исключений | @SneakyThrows( UnsupportedEncodingException.class) public String utf8ToString(byte[] bytes) { return new String(bytes, «UTF-8»); } |
|
@Synchronized |
простое создание synchronized блоков |
|
Много кода
|
@Log |
добавление инницилизации логирования, так же позволяет выбрать вид логгера: @CommonsLog, @JBossLog, Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j |
|
|
| Val | простое создание финальной переменной с выводом типа, то есть то самый val о котором спорили |
|
|
@Cleanup |
простое определение ресурсов, так чтобы они автоматически закрывались после окончания работы кода. (не так актуально при использовании try with resources ) |
|
|
Если таблица кажется плохо читаемой, просто по очереди
Название:
@NonNull
Описание: обработка переменных,
которые не должны получать null
Код Lombok:
Название: Getter /
Setter
Описание: легкое создание getter’ов и
setter’ов
Код Lombok:
Название: @ToString
Описание: определение аннотации перед классом,
для реализации стандартного toString метода
Код Lombok:
Название: @EqualsAndHashCode
Описание: легкое создание методов Equals и HashCode
Код Lombok:
Название:
@NoArgsConstructor,
@RequiredArgsConstructor,
@AllArgsConstructor
Описание: создания пустого конструктора,
конструктора включающего все final поля,
либо конструктора включающего все возможные поля
Код Lombok:
Название: Data
Описание: генерация всех служебных методов,
заменяет сразу команды @ToString, @EqualsAndHashCode,
Getter, Setter, @RequiredArgsConstructor
Код Lombok:
Название: Value
Описание: создание неизменяемых классов,
аналог Data, но для неизменяемых классов
Код Lombok:
Код обычной Java:
Название: Builder
Описание: реализация паттерна bulder,
Singular – используется для объектов в
единственном экземпляре (добавления элемента
в коллекции и т.п.)
Код Lombok:
Код обычной Java:
Название: @SneakyThrows
Описание: обертка проверяемых исключений
Код Lombok:
@SneakyThrows(
UnsupportedEncodingException.class)
public String utf8ToString(byte[] bytes) {
return new String(bytes, «UTF-8»);
}
Код Lombok:
Название: @Synchronized
Описание: простое создание synchronized блоков
Код Lombok:
Код обычной Java:
Название: Log
Описание: добавление инницилизации логирования,
так же позволяет выбрать вид логгера: @CommonsLog,
@JBossLog, Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j
Код Lombok:
Val простое создание финальной
переменной с выводом типа,
то есть то самый val о котором
спорили
Название: @Cleanup
Описание: простое определение ресурсов,
так чтобы они автоматически закрывались
после окончания работы кода.
(не так актуально при использовании
try with resources )
Код Lombok:
Описание: обработка переменных,
которые не должны получать null
Код Lombok:
Код обычной Java:public Example(@NonNull P p) { super("Hello"); this.name = p.getName(); }
public Example(@NonNull P p) { super("Hello"); if (p == null) { throw new NullPointerException("p"); } this.name = p.getName(); }
Название: Getter /
Setter
Описание: легкое создание getter’ов и
setter’ов
Код Lombok:
Код обычной Java:@Getter @Setter private int age = 10;
private int age = 10; public int getAge() { return age; } public void setAge(int age) { this.age = age; }
Название: @ToString
Описание: определение аннотации перед классом,
для реализации стандартного toString метода
Код Lombok:
Код обычной Java:@ToString(exclude="f") public class Example
public class Example { @Override public String toString() { return ...; }
Название: @EqualsAndHashCode
Описание: легкое создание методов Equals и HashCode
Код Lombok:
Код обычной Java:@EqualsAndHashCode( exclude={"id1", "id2"}) public class Example {
public class Example { ... @Override public boolean equals(Object o) { ... } @Override public int hashCode() { ... }
Название:
@NoArgsConstructor,
@RequiredArgsConstructor,
@AllArgsConstructor
Описание: создания пустого конструктора,
конструктора включающего все final поля,
либо конструктора включающего все возможные поля
Код Lombok:
Код обычной Java:@RequiredArgsConstructor( staticName = "of" ) @AllArgsConstructor( access = AccessLevel.PROTECTED ) public class E<T> {
public class E<T> { private E(T description) { ... } public static <T>E<T> of( T description ) { return new E<T>(description); }
Название: Data
Описание: генерация всех служебных методов,
заменяет сразу команды @ToString, @EqualsAndHashCode,
Getter, Setter, @RequiredArgsConstructor
Код Lombok:
@Data public class Example { private final String name; private int age; }
public class Example { private final String name; private int age; public Example( String name ) { this.name = name; } public String getName() { return this.name; } void setAge(int age) { this.age = age; } public int getAge() { return this.age; } @Override public String toString() { return ...; } @Override public boolean equals( Object o ) { .... } @Override public int hashCode() { ... }
Название: Value
Описание: создание неизменяемых классов,
аналог Data, но для неизменяемых классов
Код Lombok:
@Value public class Example { private final String name; private int age; }
Код обычной Java:
public class Example { private final String name; private final int age; public Example( String name, int age ) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } @Override public String toString() { return ...; } @Override public boolean equals( Object o ) { .... } @Override public int hashCode() { ... }
Название: Builder
Описание: реализация паттерна bulder,
Singular – используется для объектов в
единственном экземпляре (добавления элемента
в коллекции и т.п.)
Код Lombok:
@Builder public class Example { private String name; private int age; @Singular private Set<String> occupations; }
Код обычной Java:
public class Example { private String name; private int age; private Set<String> occupations; Example( String name, int age, Set<String> occupations ) { this.name = name; this.age = age; this.occupations = occupations; } public static ExampleBuilder builder() { return new ExampleBuilder(); } public static class ExampleBuilder { private String name; private int age; private ArrayList<> occupations; ExampleBuilder() { } public ExampleBuilder name( String name ) { this.name = name; return this; } public ExampleBuilder age( int age ) { this.age = age; return this; } public ExampleBuilder occupation( String occupation ) { if (this.occupations == null) { this.occupations = new ArrayList<String>(); } this.occupations.add(occupation); return this; } ... public Example build() { Set<String> occupations = ...; return new Example(name, age, occupations); } @java.lang.Override public String toString() { ... } } }
Название: @SneakyThrows
Описание: обертка проверяемых исключений
Код Lombok:
@SneakyThrows(
UnsupportedEncodingException.class)
public String utf8ToString(byte[] bytes) {
return new String(bytes, «UTF-8»);
}
Код Lombok:
public String utf8ToString(byte[] bytes) { try { return new String(bytes, "UTF-8"); } catch (UnsupportedEncodingException e) { throw Lombok.sneakyThrow(e); } }
Название: @Synchronized
Описание: простое создание synchronized блоков
Код Lombok:
private final Object readLock = new Object(); @Synchronized public static void hello() { ...; } @Synchronized public int answerToLife() { ... } @Synchronized("readLock") public void foo() { ... }
Код обычной Java:
private static final Object $LOCK = new Object[0]; private final Object $lock = new Object[0]; private final Object readLock = new Object(); public static void hello() { synchronized($LOCK) { ... } } public int answerToLife() { synchronized($lock) { ... } } public void foo() { synchronized(readLock) { ... } }
Название: Log
Описание: добавление инницилизации логирования,
так же позволяет выбрать вид логгера: @CommonsLog,
@JBossLog, Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j
Код Lombok:
Код обычной Java:@Slf4j public class Example { public static void main(String... args) { log.error("error"); }
public class Example { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class); public static void main(String... args) { log.error("error"); }
переменной с выводом типа,
то есть то самый val о котором
спорили
val map = new HashMap<Integer, String>(); for (val entry : map.entrySet()) { ... }
final HashMap<Integer, String> map = new HashMap<Integer, String>(); ... for (final Map.Entry<Integer, String> entry : map.entrySet()) { ... }
Название: @Cleanup
Описание: простое определение ресурсов,
так чтобы они автоматически закрывались
после окончания работы кода.
(не так актуально при использовании
try with resources )
Код Lombok:
Код обычной Java:@Cleanup InputStream in = new FileInputStream(args[0]); @Cleanup OutputStream out = new FileOutputStream(args[1]); ...
InputStream in = new FileInputStream(args[0]); try { OutputStream out = new FileOutputStream(args[1]); try { ... } finally { if (out != null) { out.close(); } } } finally { if (in != null) { in.close(); } }
