Ломбок использование и принцип

Java задняя часть API Project Lombok

1. Знакомство с Ломбоком

во-первыхLombokЭто подключаемый модуль прикладного инструмента для Java IDE, инструмент, который может помочь нам упростить и устранить часть обязательного, но раздутого кода Java с помощью простых аннотаций, таких как конструкторы свойств, геттеры, сеттеры, равные, хэш-код, метод toString. В сочетании с IDE с использованием соответствующих аннотаций соответствующие методы могут быть сгенерированы при компиляции исходного кода. Официальный адрес:https://projectlombok.org/.

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

2. Установка

2.1 Установка плагина

IDE, в основном используемая автором, - это идея Intellij, и компилятор должен быть в

preference->plugins->Browse repositories

Найдите ломбок, затем установите плагины, это займет некоторое время. Скриншот автора установлен.
lombok

ломбок плагин

2.2 Добавить пакет jar

Добавьте в проект пакет jar от lombok.Автор использует maven, поэтому в файл pom добавляются следующие зависимости. См. Официальный сайт для использования Gradle.

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

3. Используйте

lombok в основном работает через аннотации.Подробные аннотации см.Lombok features.

With Lombok:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
public class UserEntity implements Serializable {
    private long userId;
    private String userName;
    private String sex;
}

После компиляции:


import java.beans.ConstructorProperties;
import java.io.Serializable;
public class UserEntity implements Serializable {
    private long userId;
    private String userName;
    private String sex;
    public long getUserId() {
        return this.userId;
    }
    public String getUserName() {
        return this.userName;
    }
    public String getSex() {
        return this.sex;
    }
    public void setUserId(long userId) {
        this.userId = userId;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public boolean equals(Object o) {
        if(o == this) {
            return true;
        } else if(!(o instanceof UserEntity)) {
            return false;
        } else {
            UserEntity other = (UserEntity)o;
            if(!other.canEqual(this)) {
                return false;
            } else if(this.getUserId() != other.getUserId()) {
                return false;
            } else {
                Object this$userName = this.getUserName();
                Object other$userName = other.getUserName();
                if(this$userName == null) {
                    if(other$userName != null) {
                        return false;
                    }
                } else if(!this$userName.equals(other$userName)) {
                    return false;
                }
                Object this$sex = this.getSex();
                Object other$sex = other.getSex();
                if(this$sex == null) {
                    if(other$sex != null) {
                        return false;
                    }
                } else if(!this$sex.equals(other$sex)) {
                    return false;
                }
                return true;
            }
        }
    }
    protected boolean canEqual(Object other) {
        return other instanceof UserEntity;
    }
    public int hashCode() {
        int PRIME = true;
        int result = 1;
        long $userId = this.getUserId();
        int result = result * 59 + (int)($userId >>> 32 ^ $userId);
        Object $userName = this.getUserName();
        result = result * 59 + ($userName == null?43:$userName.hashCode());
        Object $sex = this.getSex();
        result = result * 59 + ($sex == null?43:$sex.hashCode());
        return result;
    }
    public String toString() {
        return "UserEntity(userId=" + this.getUserId() + ", userName=" + this.getUserName() + ", sex=" + this.getSex() + ")";
    }
    @ConstructorProperties({"userId", "userName", "sex"})
    public UserEntity(long userId, String userName, String sex) {
        this.userId = userId;
        this.userName = userName;
        this.sex = sex;
    }
}

Вот аннотации, которые я часто использую.

  • val, используемый перед локальными переменными, эквивалентен объявлению переменной final

  • @Value
    Используемый в классах, это неизменяемая форма @Data, которая эквивалентна добавлению окончательных объявлений к свойствам, предоставляя только методы получения, а не методы установки.

  • @Data
    @ToString, @EqualsAndHashCode, @Getter для всех свойств, комбинации @Setter и @RequiredArgsConstructor для всех нефинальных свойств, обычно мы используем эту аннотацию.

  • @NoArgsConstructor конструктор без аргументов

  • @AllArgsConstructor конструктор всех аргументов

  • @ToString
     Сгенерируйте метод toString. По умолчанию будут выведены имя класса и все атрибуты. Атрибуты будут выведены по порядку, разделенные запятыми. 

  • @EqualsAndHashCode
    По умолчанию все непереходные и нестатические поля используются для создания методов equals и hascode, и вы можете указать, какие свойства использовать.

  • @Getter / @Setter
    Как упоминалось выше, обычно нет необходимости добавлять эту аннотацию при использовании @data. Его можно применять к классам и свойствам.При размещении в классе методы Getter/Setter будут созданы для всех нестатических свойств.При размещении в свойствах методы Getter/Setter будут созданы для этого свойства. И может указать уровень доступа методов Getter/Setter.

  • @NonNull, добавление этой аннотации к параметру метода автоматически проверит, является ли параметр пустым в методе.Если он пуст, будет сгенерировано NPE (NullPointerException).

  • @Cleanup
    Автоматически управлять ресурсами, используемыми перед локальными переменными, автоматически очищать ресурсы перед выходом из текущей области переменных и автоматически генерировать код, такой как try-finally, для закрытия потока.

  • @Log
    Различные типы объектов журнала генерируются в соответствии с разными аннотациями, но все имена экземпляров являются журналами, и существует 7 необязательных классов реализации:

    1). @Log4j

    private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);

    2). @Log4j2

    private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);

    3). @Slf4j

    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);

    4). @XSlf4j

    private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

    5). @CommonsLog

    private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);

    6). @JBossLog

    private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);

    7). @Log

    private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
    

    По умолчанию именем логгера будет имя класса с аннотацией @Log. Конечно, это также может быть названо индивидуально через параметр темы, например@XSlf4j(topic="reporting").

4. Принцип

Ломбок в основном действует через аннотации, аннотации введены из jdk5, и есть два способа парсинга.
Первый — это синтаксический анализ во время выполнения,@Retention(RetentionPolicy.RUNTIME), Определите политику хранения аннотации, чтобы аннотацию можно было получить путем отражения.
Другой — синтаксический анализ во время компиляции, который имеет два механизма.

  • Инструмент обработки аннотаций, apt был создан на основе JDK5, JDK7 был помечен как просроченный и не рекомендуется для использования, и был полностью удален в JDK8. Начиная с JDK6, его можно заменить подключаемым API обработки аннотаций. Есть две причины для поддается замене. Все API находятся в нестандартном пакете com.sun.mirror, они не интегрированы в javac и их нужно запускать дополнительно.

  • Pluggable Annotation Processing API
    lombok реализован таким образом.На основе JSR 269, он был добавлен начиная с JDK6.В качестве альтернативы apt решает две проблемы apt.При выполнении javac будет вызывать программу, реализующую API, так что мы можно скомпилировать Чтобы внести некоторые улучшения, процесс выполнения javac выглядит следующим образом:

pap

поток выполнения javac

5. Резюме

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


Ссылаться на

  1. Lombok Docs
  2. Ява странные трюки Ломбок