Lombok

Проектът Lombok е базирана на анотации Java библиотека, която ви позволява да намалите шаблонния код. Lombok предлага различни анотации, насочени към замяна на Java код, който е шаблонен, повтарящ се или досаден за писане. Като използвате Lombok можете да избегнете писането на конструктори без аргументи, toString(), equals() и hashCode() методи като добавите няколко анотации. По време на компилиране библиотеката инжектира байт кода, представляващ желания шаблонен код в .class файловете.

Добавяне на библиотеката:

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <optional>true</optional>
</dependency>

За изключване на Lombok от крайния jar файл:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <excludes>
            <exclude>
                <groupId>org.project-lombok</groupId>
                <artifactId>lombok</artifactId>
            </exclude>
        </excludes>
    </configuration>
</plugin>

Най-често използвани анотации

@Getter, @Setter

Когато дадено поле е анотирано с @Getter и/или @Setter, Lombok автоматично генерира съответно гетър и/или сетър по подразбиране. Генерираният метод по подразбиране ще бъде public, освен ако не е зададен AccessLevel. Възможните опции за последния са PUBLIC, PROTECTED, PACKAGE и PRIVATE.

public class Author {
    private int id;

// Библиотеката ще създаде методи за достъп и модификация на полето name
    @Getter @Setter	
    private String name;

// Библиотеката ще създаде setter метод с модификатор за достъп protected
    @Setter(AccessLevel.PROTECTED)
    private String surname;
}

С анотациите @Getter и @Setter можете да коментирате и целия клас. В този случай логиката ще бъде приложена към всяко поле на класа. Можете ръчно да деактивирате генерирането на getter/setter за дадено поле, като използвате опцията AccessLevel.NONE.

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

@NoArgsConstructor, @RequiredArgsConstructor,@AllArgsConstructor

Когато даден клас е анотиран с @NoArgsConstructor, Lombok автоматично генерира конструктор без параметри. По същия начин, когато се анотира с @AllArgsConstructor, ще се генерира конструктор с параметри за всяко поле на класа.

@RequiredArgsConstructor води до конструктор с параметър за всяко поле, което изисква специална обработка - неинициализирани final полета, както и всички полета, маркирани като @NonNull,но неинициализирани на мястото на тяхната декларация.

Статичните полета ще бъдат игнорирани от тези анотации.

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

@ToString

Ако даден клас е анотиран с @ToString, Lombok ще се погрижи за генерирането на метода. По подразбиране ще бъде върнат низ, съдържащ името на класа, последвано от стойностите на всяко поле, разделени със запетая. Ако зададете стойност на параметъра includeFieldNames true, името на всяко поле ще бъде поставено преди неговата стойност. По подразбиране всички нестатични полета ще бъдат взети предвид при генерирането на метода. Анотирайте поле с @ToString.Exclude, ако искате Lombok да го игнорира.

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

@EqualsAndHashCode

Анотирайте клас с @EqualsAndHashCode и Lombok автоматично ще създаде методите. По подразбиране всички нестатични, нетранзитивни полета ще бъдат взети под внимание. Можете да промените кои полета да се използват, като ги анотирате с @EqualsAndHashCode.Include или @EqualsAndHashCode.Exclude. Като алтернатива можете да анотирате своя клас с @EqualsAndHashCode(onlyExplicitlyIncluded=true) и след това да посочите точно кои полета или методи искате да се използват, като ги анотирате с @EqualsAndHashCode.Include.

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

@NonNull

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

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; 
  }
}

Без библиотеката Lombok кодът би имал следния вид:

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 cannot be null");
        }
        this.id = id;
        if (name == null) {
          throw new NullPointerException("name cannot be null");
        }
        this.name = name;
        this.surname = surname; 
  }
}

@Data

@Data е анотация, която събира в едно цяло анотациите @ToString, @Getter, @Setter, @EqualsAndHashCode и @RequiredArgsConstructor. По този начин генерира всички шаблони, необходими за POJO клас. А именно: гетъри за всички полета, сетъри за всички non-final полета, имплементации на toString, equals и hashCode, включващи всички полета от класа и конструктор за всички полета, изискващи специална обработка.

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

Last updated