Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus "Освітні вимірювання, адаптовані до стандартів ЄС". В рамк...

Благодаря Интернету количество писателей и поэтов увеличивается в геометрической прогрессии. Поголовье читателей начинает заметно отставать.

среда, 27 декабря 2017 г.

Шпаргалки Java программиста 10: Lombok / Программирование на Java

Lombok — проект по добавлению дополнительной функциональности в Java c помощью изменения исходного кода перед Java компиляцией. 

По сути, проект Lombok позволяет избавиться от многословности Java в большинстве случаев и перестать писать огромные простыни кода из гетеров, сеттеров, equals, hashcode и toString (да их обычно генерит IDE, но читать и менять все равно приходится программисту), в результате Java становиться почти такой же краткой как Kotlin, Scala или C#. 

Что особенно радует, Lombok очень прост и легок в добавлении к вашему проекту. Если вам, как и мне, нравится принцип KISS, то советую посмотреть на Lombok.

Так же рекомендую, посмотреть на другие статьи цикла, например последную шпаргалку по Java SE8

Добавление в проекты очень простое, достаточно добавить обычные зависимости: 

Подробнее...

Команды и аннотации:
НазваниеОписаниеПример Lombok Пример обычной Java
@NonNullобработка переменных,
которые не должны получать null
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’ов
@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 метода
@ToString(exclude="f")
public class Example
public class Example {
  @Override 
  public String toString() {
    return ...;
  }
@EqualsAndHashCodeлегкое создание методов Equals и HashCode
@EqualsAndHashCode(
   exclude={"id1", "id2"})
public class Example {
public class Example {
  ...
  @Override 
  public boolean equals(Object o) {
     ...
  }
  
  @Override 
  public int hashCode() {
     ...
  }
@NoArgsConstructor, 
@RequiredArgsConstructor, 
@AllArgsConstructor
создания пустого конструктора,
конструктора включающего все final поля,
либо конструктора включающего все возможные поля
@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,
GetterSetter, @RequiredArgsConstructor
@Data
public class Example { 
  private final String name;
  private int age;
}
Много кода
@Valueсоздание неизменяемых классов,
аналог Data, но для неизменяемых классов
@Value
public class Example { 
  private final String name;
  private int age;
}
Много кода
@Builderреализация паттерна bulder,
Singular – используется для объектов в
единственном экземпляре (добавления элемента
в коллекции и т.п.)  
@Builder
public class Example {
  private String name;
  private int age;
  @Singular 
  private Set<String> occupations;
}
много кода
@SneakyThrowsобертка проверяемых исключений
@SneakyThrows(
UnsupportedEncodingException.class)
public String utf8ToString(byte[] bytes) {
return new String(bytes, «UTF-8»);
}
public String utf8ToString(byte[] bytes) {
    try {
      return new String(bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      throw Lombok.sneakyThrow(e);
    }
 }
@Synchronizedпростое создание synchronized блоков
private final Object readLock = new Object();
  
@Synchronized
public static void hello() {
    ...;
 }
  
 @Synchronized
 public int answerToLife() {
   ...
 }
  
 @Synchronized("readLock")
 public void foo() {
    ...
 }
Много кода
@Logдобавление инницилизации логирования,
так же позволяет выбрать вид логгера: @CommonsLog,
@JBossLog, Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j
@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 о котором
спорили
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 )
@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();
      }
    }


Примеры кода частично взял с сайта проекта Lombok (cократив), если интересно больше подробностей см. официальный сайт проекта.

Спасибо за внимание!

P.S. Если понравилось посмотрите другие другие статьи цикла, например последную шпаргалку по Java SE8

Источник: https://habrahabr.ru/post/345520/?utm_source=habrahabr&utm_medium=rss&utm_campaign=345520

Смотри также:

Зачем нужна Java. http://fetisovvs.blogspot.com/2014/07/java.html
JAVA 9. Что нового? http://fetisovvs.blogspot.com/2017/10/java-9-java.html
Концепции объектно-ориентированного программирования — ООП в Java. http://fetisovvs.blogspot.com/2017/01/java-java.html
Двести пятьдесят русскоязычных обучающих видео докладов и лекций о Java. http://fetisovvs.blogspot.com/2015/12/java-5-java-java.html
Абстрактные классы и методы. http://fetisovvs.blogspot.com/2017/02/java.html
Полное руководство по Java Reflection API. Рефлексия на примерах. http://fetisovvs.blogspot.com/2017/02/java-reflection-api-java.html
Микросервисы для Java программистов. Практическое введение во фреймворки и контейнеры. http://fetisovvs.blogspot.com/2017/10/java-java.html
Микросервисы для Java программистов. Практическое введение во фреймворки и контейнеры. (Часть 3). http://fetisovvs.blogspot.com/2017/10/java-3-java.html
ТОП-3 способа конвертировать массив в ArrayList. Пример на Java. http://fetisovvs.blogspot.com/2016/09/3-arraylist-java-java.html
Ввод–вывод в Java. http://fetisovvs.blogspot.com/2016/05/java-java_28.html
Enum-Всемогущий. http://fetisovvs.blogspot.com/2017/02/enum-java.html
Массивы в Java. Создание и обработка. http://fetisovvs.blogspot.com/2017/10/java-java_18.html
Arrays, Collections: Алгоритмический минимум. http://fetisovvs.blogspot.com/2017/12/arrays-collections.html

Популярные методы для работы с Java массивами. http://fetisovvs.blogspot.com/2016/09/java-java_29.html
Пример использования метода replace в Java. Как заменить символ в строке? http://fetisovvs.blogspot.com/2017/01/replace-java-java.html
Класс Scanner в Java — описание и пример использования. http://fetisovvs.blogspot.com/2017/01/scanner-java-java.html
Пример использования метода trim в Java: как удалить пробелы в начале и конце строки? http://fetisovvs.blogspot.com/2017/01/trim-java-java.html
Spark — Потрясающий веб-микрофреймворк для Java. http://fetisovvs.blogspot.com/2017/10/spark-java-java.html
Чтение и запись CSV файла с помощью SuperCSV. http://fetisovvs.blogspot.com/2017/01/csv-supercsv-java-java.html
Конструкция try/catch/finally (исключения). http://fetisovvs.blogspot.com/2017/01/trycatchfinally-java.html
1000+ часов видео по Java на русском. http://fetisovvs.blogspot.nl/2017/06/1000-java-java.html
Шпаргалка Java программиста 7.1 Типовые задачи: Оптимальный путь преобразования InputStream в строку. http://fetisovvs.blogspot.com/2016/04/java-71-inputstream-java.html
Шпаргалки Java программиста 9: Java SE — Шпаргалка для собеседований и повторений. http://fetisovvs.blogspot.com/2017/12/java-9-java-se-java.html

Шпаргалка Java программиста 8. Библиотеки для работы с Json (Gson, Fastjson, 
LoganSquare, Jackson, JsonPath и другие). http://fetisovvs.blogspot.com/2016/04/java-8-json-gson-fastjson-logansquare.html
Реализация ООП-наследования в классах, работающих с SQL и MS Entity Framework. http://fetisovvs.blogspot.com/2017/02/sql-ms-entity-framework.html
Как установить соединение с СУБД MySQL в IntelliJ IDEA в редакции Community. http://fetisovvs.blogspot.com/2016/04/mysql-intellij-idea-community-java.html
Как с помощью maven работать с библиотеками, которых в maven нет. http://fetisovvs.blogspot.com/2017/03/maven-maven-java.html
Диагностика утечек памяти в Java. http://fetisovvs.blogspot.com/2017/03/java-java_18.html
Программируем… выход из лабиринта. http://fetisovvs.blogspot.com/2015/10/java.html
Основы работы с IntelliJ IDEA. Интерфейс программы. http://fetisovvs.blogspot.com/2016/09/intellij-idea-java.html

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

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