Здесь изложен необходимый минимум информации, которую нужно изучить, если хочешь приступить к использованию проекта Lombok. Рассмотрим, как интегрировать его в вашу IDE и использовать, чтобы сократить объем шаблонного кода.  

Java – отличный язык, только многословный. Возможно, вам придется писать много кода, чтобы достичь даже самых простых целей. Кроме того, в Java определенно присутствует повторяющийся код, например, геттеры и сеттеры. Поэтому у вас получаются огромные объемы повторяющегося и необязательного кода. Мало того, что такой код не добавляет ничего нового в бизнес-логику вашего приложения, так и писать его долго и скучно. Именно поэтому следует переходить к использованию библиотек и инструментов – они помогают повысить продуктивность и избежать этой рутины. Именно здесь в игру вступает Lombok!

Это библиотека Java, в которой предоставляется ряд аннотаций, направленных на исключение именно того кода Java, о котором известно, что он часто становится повторяющимся и/или шаблонным. Проект Lombok включается прямо в процесс сборки. Затем Lombok автоматически сгенерирует для Java байт-код, который вставляет в файлы .class, необходимые для реализации желаемого поведения, в зависимости от используемых вами аннотаций. Следовательно, каждая аннотация, предлагаемая в проекте Lombok, позволяет частично обойтись без написания методов и логики, без которых вы хотели бы обойтись. Речь о конструкторах, равенствах и функциях хеш-кода. Так вы сможете сэкономить массу времени и сосредоточиться на бизнес-логике вашего проекта. Кроме того, вы сможете держать базу кода сравнительно компактной, чистой, удобной для чтения и поддержки.

Сначала рассмотрим, что представляет собой проект Lombok и как он работает. Затем изучим наиболее распространенные и актуальные аннотации Lombok, разберемся, какие из них наиболее важные, где и как их использовать. Далее рассмотрим, как интегрировать их в вашу IDE (интегрированную среду разработки) и почему не стоит опасаться их использовать.

Предпосылки

Вот что вам нужно установить, чтобы воспроизвести все примеры, приведенные ниже:

  • Java >= 1.8

  • Gradle >= 4.x or Maven 3.6.x

  • Project Lombok >= 1.18.20

Что такое Lombok

Проект Lombok (далее – просто Lombok) – это основанная на аннотациях библиотека Java, позволяющая сократить шаблонный код. В Lombok предлагаются различные аннотации, цель которых – заменить ненужный повторяющийся код, писать который утомительно. Например, Lombok избавит вас от написания безаргументных конструкторов, методов toString(), equals() и hashCode(), для этого нужно просто добавить несколько аннотаций. Плюс, как будет показано ниже, эта библиотека подключается прямо к вашей IDE, поэтому работа воспринимается так, словно вы написали весь шаблонный код сами.

Установить Lombok легко – добавьте lombok к вашим зависимостям. Если вы пользуетесь Gradle, допишите следующие две строки с зависимостями в ваш файл build.gradle:

compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'

Тогда как если работаете с Maven, добавьте следующую зависимость в ваш файл pom.xml:

<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.20</version>
      <scope>provided</scope>
</dependency>

Кроме того, добавьте зависимость Lombok в конфигурационный раздел maven-compiler-plugin следующим образом:

<build>
      <plugins>      
            
            <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <version>3.5.1</version>
                  <configuration>
                        <source>11</source> <!-- depending on your project -->
                        <target>11</target> <!-- depending on your project -->
                        <annotationProcessorPaths>
                              <path>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                    <version>1.18.20</version>
                              </path>                              
                        </annotationProcessorPaths>
                  </configuration>
            </plugin>
            
            <!-- ... -->  
            
      </plugins>
</build>

Теперь вы настроили все необходимое, чтобы приступить к работе с Lombok.

Наиболее распространенные аннотации Lombok

Ниже перечислены самые распространенные и важные аннотации Lombok. Каждая из них будет объяснена и рассмотрена на практике в сравнении с эквивалентным «переводом» на обычный язык Java. Чтобы посмотреть примеры и получить дополнительную поддержку, можно щелкнуть по любой аннотации и посетить посвященную ей страницу на сайте с официальной документацией по Lombok.

@Getter, @Setter

Когда после аннотировано @Getter и/или @Setter, Lombok автоматически сгенерирует заданный по умолчанию геттер и/или сеттер, соответственно. Заданная по умолчанию реализация геттеров просто берет на себя возврат аннотированного поля. Аналогично, заданная по умолчанию реализация сеттеров принимает один параметр того же типа, что и аннотированное поле, и просто устанавливает его в полученное значение. Когда поле под названием value аннотируется одновременно @Getter и @Setter, Lombok определит метод getValue() (или isValue(), если это поле типа boolean) и setValue(). Сгенерированный метод, действующий как геттер и сеттер, будет публичным (public), если не указан конкретный уровень доступа (AccessLevel). Допустимые значения  AccessLevel – это PUBLIC, PROTECTED, PACKAGE и PRIVATE. Обратите внимание: можно аннотировать и целый класс. В таком случае данная логика будет применяться к каждому из его полей.

С Lombok

@Getter
@Setter
public class Author {
    private int id;
    private String name;
    @Setter(AccessLevel.PROTECTED)
    private String surname;
}

Просто Java

public class User {
    private int id;
    private String name;
    private String surname;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    protected void setSurname(String surname) {
        this.surname = surname;
    }
}

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

Когда класс аннотирован @NoArgsConstructor, Lombok возьмет на себя автоматическую генерацию непараметризованного конструктора. Аналогично, когда класс аннотирован @AllArgsConstructor, будет сгенерирован конструктор с одним параметром для каждого поля вашего класса. Далее, @RequiredArgsConstructor позволит получить конструктор с параметром для каждого поля, но эти параметры потребуют специальной обработки. В частности, здесь мы будем работать с неинициализированными полями final, а также с любыми полями, помеченными как @NonNull, которые не инициализируются при объявлении. Пожалуйста, не забудьте, что статические поля будут этими аннотациями игнорироваться.

С Lombok

@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class Author {
    private int id;
    private String name;
    private String surname;
    private final String birthPlace;
}

Просто Java

public class Author {
    private int id;
    private String name;
    private String surname;
    private final String birthPlace;

    // @NoArgsConstructor
    public Author() {}

    // @AllArgsConstructor
    public Author(int id, String name, String surname, String birthPlace) {
      this.id = id
      this.name = name
      this.surname = surname
      this.birthPlace = birthPlace
    }

    // @RequiredArgsConstructor
    public Author(String birthPlace) {
      this.birthPlace = birthPlace
    }
}

@ToString

Когда класс аннотирован @ToString, Lombok позаботится о том, чтобы сгенерировать нужную реализацию метода toString(). По умолчанию будет возвращаться строка, в которой содержится имя класса, за которой следуют значения всех полей, разделенные запятыми. Устанавливая параметр includeFieldNames в значение true, добьемся того, что имя каждого поля будет ставиться перед его значением. По умолчанию при генерировании метода toString() будут учитываться все нестатические поля. Если мы хотим, чтобы Lombok проигнорировал поле, нужно аннотировать его  @ToString.Exclude. Как вариант, можете сами указать, какие поля на ваше усмотрение должны аннотироваться, для этого воспользуйтесь @ToString(onlyExplicitlyIncluded = true). Затем пометьте при  помощи @ToString.Include каждое поле, которое хотите включить.

С Lombok

@ToString(includeFieldNames=true)
public class Author {
    private int id;
    private String name;
    private String surname;
}

Просто Java

public class Author {
    private int id;
    private String name;
    private String surname;

    @Override 
    public String toString() {
      return "Author(id=" + this.id + ", name=" + this.name + ", surnname=" + this.surname + ")";
  }
}

@EqualsAndHashCode

Если аннотировать класс при помощи @EqualsAndHashCode, то Lombok автоматически реализует за вас методы equals() и hashCode(). По умолчанию будут учитываться все нестатические непереходные поля. Можно повлиять на то, какие поля будут использоваться, аннотировав их @EqualsAndHashCode.Include или @EqualsAndHashCode.Exclude. Как вариант, можете аннотировать ваш класс при помощи @EqualsAndHashCode(onlyExplicitlyIncluded = true), а затем в точности указать, какие поля или методы вы хотите использовать, пометив их @EqualsAndHashCode.Include. Обратите внимание: Lombok сгенерирует методы equals() и hashCode(), не нарушая контракта между ними. Перейдите по ссылкам о двух этих методах на сайт с официальной документацией Java и почитайте подробнее о тех контрактах, которым должны удовлетворять реализации equals() и hashCode().

С Lombok

@Getter
@Setter
@EqualsAndHashCode
public class Author {
    private int id;
    private String name;
    private String surname;
}

Просто Java

public class Author {
    
    // геттеры и сеттеры ...

    @Override 
    public int hashCode() {
       final int PRIME = 31;
       int result = 1;
       result = prime * result + id;
       result = prime * result + ((name == null) ? 0 : name.hashCode());
       result = prime * result + ((surname == null) ? 0 : surname.hashCode());
       return result;
    }

    @Override 
    public boolean equals(Object o) {
       if (o == this) return true;
       if (!(o instanceof Author)) return false;
       Author other = (Author) o;
       if (!other.canEqual((Object)this)) return false;
       if (this.getId() == null ? other.getId() != null : !this.getId().equals(other.getId())) return false;
       if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
       if (this.getSurname() == null ? other.getSurname() != null : !this.getSurname().equals(other.getSurname())) return false;
       return true;
    }
}

@NonNull

Можно аннотировать при помощи @NonNull компонент записи, параметр, метод или целый конструктор, В таком случае Lombok сгенерирует для вас команды для проверки на нуль.

С Lombok

public class Author {
    private int id;
    private String name;
    private String surname;

    public Author(
      @NonNull int id,
      @NonNull String name,
      String surname
    ) {
      this.id = id;
      this.name = name;
      this.surname = surname; 
  }
}

Просто Java

public class Author {
    private int id;
    private String name;
    private String surname;

    public Author(
      int id,
      String name,
      String surname
    ) {
        if (id == null) {
          throw new NullPointerException("id is marked @NonNull but is null");
        }
        this.id = id;
        if (name == null) {
          throw new NullPointerException("name is marked @NonNull but is null");
        }
        this.name = name;
        this.surname = surname; 
  }
}

@Data

@Data – это сокращенная аннотация, сочетающая возможности @ToString@EqualsAndHashCode@Getter @Setter и @RequiredArgsConstructor. Так что @Data генерирует весь шаблонный код, вовлеченный в работу с объектами POJO (Plain Old Java Objects). Это, в частности, дает нам геттеры для всех полей, сеттеры для всех нефинальных полей, правильные реализации toStringequals и hashCode, охватывающие все поля класса, а также конструктор для всех финальных полей.

С Lombok

@Data
public class Author {
    private final int id;
    private String name;
    private String surname;
}

Просто Java

public class Author {
    private final int id;
    private String name;
    private String surname;

    public Author(int id) {
        this.id = id;
    }    

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    @Override 
    public int hashCode() {
       final int PRIME = 31;
       int result = 1;
       result = prime * result + getId();
       result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
       result = prime * result + ((getSurname() == null) ? 0 : getSurname().hashCode());
       return result;
    }

    @Override 
    public boolean equals(Object o) {
       if (o == this) return true;
       if (!(o instanceof Author)) return false;
       Author other = (Author) o;
       if (!other.canEqual((Object)this)) return false;
       if (this.getId() == null ? other.getId() != null : !this.getId().equals(other.getId())) return false;
       if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
       if (this.getSurname() == null ? other.getSurname() != null : !this.getSurname().equals(other.getSurname())) return false;
       return true;
    }
}

@Value

@Value – это неизменяемый вариант @Data. С этой аннотацией Lombok по умолчанию делает все поля private и final. Кроме того, сеттеры не генерируются, а класс как таковой помечается final. Таким образом, от этого класса нельзя наследовать. Точно как и в случае с @Data, создаются реализации toString(), equals() и hashCode().

С Lombok

@Data
public class Author {
    int id;
    String name;
    String surname;
}

Просто Java

public final class Author {
    private final int id;
    private final String name;
    private final String surname;

    public Author(int id, String name, String surname) {
      this.id = id
      this.name = name
      this.surname = surname
    }  

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getSurname() {
        return surname;
    }

    @Override 
    public int hashCode() {
        final int PRIME = 31;
        int result = 1;
        result = prime * result + getId();
        result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
        result = prime * result + ((getSurname() == null) ? 0 : getSurname().hashCode());
        return result;
    }

    @Override 
    public boolean equals(Object o) {
        if (o == this) return true;
        if (!(o instanceof Author)) return false;
        Author other = (Author) o;
        if (!other.canEqual((Object)this)) return false;
        if (this.getId() == null ? other.getId() != null : !this.getId().equals(other.getId())) return false;
        if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
        if (this.getSurname() == null ? other.getSurname() != null : !this.getSurname().equals(other.getSurname())) return false;
        return true;
    }
}

Продвинутые аннотации Lombok

Ниже рассмотрены самые сложные аннотации Lombok. Подробнее о каждой из них рассказано на собственной странице в официальной документации Lombok.

@Cleanup

Аннотация @Cleanup позволяет гарантировать, что заданный ресурс будет автоматически очищаться перед тем, как покинет актуальную область видимости. По умолчанию предполагается, что метод очистки аннотированного ресурса будет close(), но вы можете сами указать имя того метода, который, по вашему желанию, будет вызываться вместо него. Обратите внимание: эта аннотация активно использует команды try-with-resources.

С Lombok

public class CleanupDemo {
  public static void main(String[] args) throws IOException {
    @Cleanup 
    InputStream input = new FileInputStream(args[0]);

    @Cleanup 
    OutputStream output = new FileOutputStream(args[1]);

    byte[] b = new byte[10000];

    while (true) {
      int r = input.read(b);

      if (r == -1) 
        break;

      output.write(b, 0, r);
    }
  }
}

Просто Java

public class CleanupDemo {
  public static void main(String[] args) throws IOException {
    try (OutputStream output = new FileOutputStream(args[1])) {
      try (InputStream input = new FileInputStream(args[0])) {
        byte[] b = new byte[10000];

        while (true) {
          int r = input.read(b);

          if (r == -1) 
            break;

          output.write(b, 0, r);
        }
      }       
    } 
  }
}

@Synchronized

Аннотация @Synchronized действует примерно так же, как и ключевое слово synchronized, но защелкивается на других объектах. Ключевое слово защелкивается на this, а эта аннотация – на особом приватном поле под названием $lock. Если это поле не существует, то Lombok создаст его. Такое поведение задано по умолчанию, но вы можете и сами указать те объекты, на которых будет происходить защелкивание. При работе с методами static аннотация будет защелкиваться на статическом поле $LOCK. Учтите, что эта аннотация, как и ключевое слово synchronized, может использоваться только со статическими методами и методами экземпляра.

С Lombok

public class SynchronizedDemo {
  private final Object objectToLock = new Object();
  
  @Synchronized
  public static void sayHello() {
    System.out.println("Hello!");
  }
  @Synchronized
  public int getOne() {
    return 1;
  }
  
  @Synchronized("objectToLock")
  public void printObject() {
    System.out.println(objectToLock);
  }
}

Просто Java

public class SynchronizedDemo {
  private static final Object $LOCK = new Object[0];
  private final Object $lock = new Object[0];
  private final Object readLock = new Object();
  
  public static void sayHello() {
    synchronized($LOCK) {
      System.out.println("Hello");
    }
  }
  
  public int getOne() {
    synchronized($lock) {
      return 1;
    }
  }
  
  public void printObject() {
    synchronized(readLock) {
      System.out.println(objectToLock);
    }
  }
}

@SneakyThrows

Аннотация @SneakyThrows позволяет бесшумно выбрасывать проверяемые исключения, не объявляя их явно в условии throws вашего метода, как принято делать. Итак, эта аннотация позволяет вам полностью избавиться от (как правило, необходимых в таких случаях) блоков try-catch, поскольку тихо обрабатывает все проверяемые исключения. В противном случае она запутала бы компилятор. Фактически, на уровне файлов классов JVM (виртуальной машины Java), все исключения могут выбрасываться безотносительно условия throws, присутствующего в ваших методах, поэтому-то данный механизм и работает. Вот почему стоит прочитать эту страницу из официальной документации Lombok, чтобы подробнее разобраться в этой аннотации и понять, как ею пользоваться.

@Builder

Возможно, вам потребуется разработать объект-строитель, который позволял бы вам создавать объекты, следуя пошаговой процедуре, например,  Author.builder().id("1").name("Maria").surname("Williams").build();. Это особенно полезно, когда имеешь дело с большими классами, в каждом из которых по несколько полей. Вместо использования конструктора со многими полями, можно попробовать этот подход, более удобочитаемый. При помощи аннотации @Builder вы поручаете Lombok генерировать строители  за вас. Аннотируя класс при помощи @Builder, Lombok выдает класс, реализующий вышеупомянутый паттерн «строитель». Например, аннотируя ею класс Author, получим автоматически сгенерированный класс AuthorBuilder. Поскольку поведение вашего строителя может быть сложным или сильно подогнанным под задачу, Lombok предлагает много параметров, при помощи которых можно достичь желаемого результата. Все они находятся здесь.

@Log

Большинство средств логирования требуют закладывать экземпляр логгера для каждого класса, в котором вы хотите вести лог. Разумеется, при этом возникает шаблонный код. Lombok, аннотируя класс при помощи @Log, автоматически добавляет статическое финальное поле log, инициализируемое вашей библиотекой логирования как требуемое. Вот почему Lombok дает разработчикам по аннотации на каждый из наиболее популярных фреймворков логирования. Их полный список находится здесь.

Плагин Lombok

К наиболее популярным и широко используемым IDE прилагается официальный плагин Lombok, предназначенный именно для упрощения работы с Lombok. В частности, он предлагает шорткаты для наиболее распространенных аннотаций Lombok. Кроме того, подсказывает, какие аннотации вам могут потребоваться или заинтересовать вас, в зависимости от того, где вы щелкаете мышью. На момент написания оригинала официально поддерживались IntelliJ IDEAEclipse, Spring Tool Suite, (Red Hat) JBoss Developer Studio, MyEclipseMicrosoft Visual Studio Code и Netbeans. Полный список поддерживаемых IDE и советы по установке даны на официальном сайте Lombok. .

Рискованно ли работать с Lombok?

Возможно, вас беспокоит, а что будет, если вы расставите аннотации Lombok по всей вашей базе кода. В самом деле, а что будет, если после этого вы решите избежать работы с Lombok? Возможно, в таком случае работа забуксует. Но на практике это не слишком большая проблема, поскольку в Lombok есть инструмент delombok. Как указано в официальной документации (где, правда, не покрыты все возможные IDE и случаи), этот инструмент действительно упрощает процесс разломбочивания вашего кода. Фактически, он обеспечивает автоматическую генерацию исходного кода Java, содержащего в байт-коде ровно те же возможности, которые внедрялись бы при помощи Lombok. Таким образом, ваша база кода, аннотированная Lombok, просто заменяется стандартной базой кода на Java, без Lombok. После этого весь ваш проект больше вообще не будет зависеть от Lombok. Соответственно, работа с Lombok не представляет никаких рисков для развития вашего проекта в будущем.

Заключение

В этой статье было рассмотрено, как использовать проект Lombok - библиотеку Java, которая автоматически подключается к вашему редактору и инструментам сборки, чтобы вам не приходилось писать скучного шаблонного повторяющегося кода, который так характерен для языка Java. Как показано в статье, Lombok помогает разработчику легко повысить производительность труда и не тратить времени на утомительную рутину. Научившись пользоваться самыми важными аннотациями, можно обойтись без написания тысяч строк кода, который не несет никакой реальной пользы для бизнес-логики вашего проекта. Кроме того, в любой момент можно легко отвязать ваш проект от использования проекта Lombok.

Комментарии (17)


  1. LeshaRB
    12.07.2022 10:18
    +1

    По версии 1.18.20 я делаю выводы, что инфа минимум на год устарела?


  1. Semenych
    12.07.2022 10:18

    Краткое руководство по макропроцессору Lombok - если вы используете Java 17, вам не нужен Lombok.

    Важный момент delombok может внезапно не работать. По крайней мере у меня такое два раза было.


  1. upagge
    12.07.2022 10:20
    +3

    Ожидание: "Lombok. Полное руководство"
    Реальность: "Здесь изложен необходимый минимум информацию"

    P.S. У вас там опечатка


  1. Inine
    12.07.2022 10:55

    В первом примере геттер для surname в голой яве почему-то получился публичным. А еще Author заменился на User - недокументированная фича ломбока?


  1. Beholder
    12.07.2022 11:09
    +2

    Скрипач не нужен, потому что есть язык на букву "K" :)


    1. GrakovNe
      12.07.2022 12:30

      Kotlin еще начать использовать надо. Во многих проектах с большим количеством легаси властвует безраздельно какая-нибудь джава 1.7 и перейти на что-то другое - значит очень сильно вложиться


    1. mmMike
      12.07.2022 13:54
      +1

      Я бы очень осторожно выбирал язык для долго играющих проектов (>3..5 лет). потому что сегодня  JetBrains есть, а завтра ее кто ни будь купит и приоритеты поменяются и т.п.

      Конечно для программистов меняющих место работы каждые год два это не принципиально.

      Но вот мне пришлось переписать код с kotlin на java. Код модуля, написанный одним "энтузиастом, повышающим свою привлекательность на рынке изучением нового языка" Потому, что найти на его замену программера java+kotlin оказалось сложнее чем переписать модуль. Вовремя не остановил и пришлось время на это тратить.

      kotlin - это исторически порождение проблемы старой Java в Android. При сравнении свежей Java + lombok аргумент "проще найти разработчика" становится более определяющим.

      Либо "я пишу на kotlin (под Android) и ничего больше не знаю" либо "Я только Java знаю" в резюме. Исключения редки.


      1. Lewigh
        12.07.2022 23:38
        +1

        kotlin - это исторически порождение проблемы старой Java в Android.

        Не нужно придумывать сказки. Kotlin ни для какого андроида не придумывали, а то что Kotlin взлетел на андроиде это был приятный сюрприз для самих JB. Никто это не скрывает, про создание данного ЯП есть достаточное количество материалов где раскрывается как все это было придумано. Популярность Kotlin на андроиде обусловлена как болью связанной с старой версией Java так и в целом куда менее консервативным сообществом адроид разработчиков.

        Я бы очень осторожно выбирал язык для долго играющих проектов (>3..5 лет). потому что сегодня  JetBrains есть, а завтра ее кто ни будь купит и приоритеты поменяются и т.п.

        Как хорошо что крупные компании никогда не позволяют себе делать неожиданные вещи. Например делать JDK то платным то бесплатным. Судится за авторские права. Ой, извините это другое.


        1. mmMike
          13.07.2022 05:35
          +1

          Не нужно придумывать сказки. Kotlin ни для какого андроида не придумывали, а то что Kotlin взлетел на андроиде это был приятный сюрприз для самих JB.

          Ээ.. Вы когда что то читаете и отвечаете на это, о не надо отвечать на свои мысли. Я не говорил что Kotlin для Android придумали.

          Если бы не было проблем с поддержкой в Android всех новых фич Java, то Kotlin 100% был бы одним из многих среди 10-ков свежепридуманных языков. Малоизвестных и скорозабытых. Преимущества/недостатки языка в таких случаях играют не первую роль. IMHO

          Как хорошо что крупные компании никогда не позволяют себе делать неожиданные вещи.

          Кстати.. А Kotlin то не на JVM движке случайно? (риторический вопрос). А JRE (если не в экосреде Андройд) то чье может быть? Не Oracle ли?

          И можно подумать, есть 100% гарантия от такого же взбрыка JB.


      1. Beholder
        13.07.2022 16:30

        Kotlin находится в open-source. Даже если JetBrains прямо сейчас исчезнет, у нас останется текущая версия, которую хоть как-то можно будет развивать.

        А кто стоит за Lombok? Два мужика каких-то в постоянных разработчиках, если судить по разделу Credits.


  1. karambaso
    12.07.2022 13:27
    +4

    Большую часть предложенного функционала генерирует IDE. И делает это явно, то есть не прячет от вас (и всех остальных) реализацию, что на порядки улучшает поддерживаемость проекта.

    Вообще, идея хитро править что-то там за сценой, что бы никто не догадался, это вполне очевидная проблема сама по себе. Ну а для берущих проект на поддержку новых разработчиков - серьёзная головная боль, устранить которую можно только одним способом - delombok.


    1. auddu_k
      13.07.2022 09:01

      А можно пример, когда деломбок прямо потребовался? Просто мой опыт говорит, что Ломбок хорош в 99 процентах (для меня пока на все 100, но процент стоит оставить, на непредвиденность)


      1. karambaso
        13.07.2022 19:02

        Рефакторинг с целью сделать явным всё то, что ранее было закамуфлированным. Если IDE всё гененрирует, то держать смесь из нормального кода и чего-то непонятного - непонятно зачем.

        Если вам хочется защитить ломбок, то напишите статью, чем же он лучше простейшей кодогенерации, а задавать наводящие вопросы и узбекским методом добиваться признания вами любимой библиотеки есть, на мой взгляд, банальное лицемерие.


  1. toolateitsme
    12.07.2022 23:35
    +3

    Понятно, что перевод, но сколько же тут воды. Не рассказано ни про одну полезную фичу из exp блока (которые уже давно повсеместно используются)
    Ни тебе https://projectlombok.org/features/experimental/Accessors (c chaining опцией), ни тебе https://projectlombok.org/features/experimental/Delegate

    -__-

    И еще вопрос, а нужен ли он сейчас вообще, в 2022 году, после многих нововведений в JDK?


    1. kzoraks
      13.07.2022 06:36

      думаю актуален пока остается достаточно большое кол-во компаний использующих 8-11 JDK


    1. AstarothAst
      14.07.2022 21:17

      Если не ошибаюсь, то основное применение ломбока сейчас — это билдеры для dto-шек, и генерация конструкторов в компонентах спринга. Как с этим поможет новое jdk?


  1. Throwable
    14.07.2022 13:02

    Есть еще файлик lombok.config, который позволяет выставить параметры по-умолчанию для аннотаций всех подпакетов. У меня, например, выставлено:

    lombok.anyConstructor.addConstructorProperties = true
    lombok.fieldDefaults.defaultPrivate = true

    Первый параметр обеспечивает безгеморную десериализацию с Jackson-ом для immutable объектов, второй -- корректирует идиотское соглашение Java насчет package-private области видимости по умолчанию.