Lombok库

文章目录

Lombok

1.介绍

Lombok 是一个 Java 库,它可以通过注解的方式减少 Java 代码中的样板代码。Lombok 自动为你生成构造函数、getter、setter、equals、hashCode、toString 方法等,从而避免了手动编写这些重复性的代码。这不仅减少了出错的机会,还让代码看起来更加简洁。

Lombok是一个编译阶段的库,能够帮我们自动补充代码,在Java程序运行阶段并不起作用。

2.主要注解

@Data:

  • 等价于 @ToString, @EqualsAndHashCode, @Getter,@Setter,@RequiredArgsConstructor.
  • 用于生成:必要参数的构造方法、getter、setter、toString、equals 和 hashcode 方法

@Getter / @Setter:

  • 分别用于生成所有的 getter 和 setter 方法
  • 可以作用于整个类,也可以作用于特定的字段

@NoArgsConstructor:

  • 生成一个无参构造方法

@AllArgsConstructor:

  • 生成一个包含所有实例变量的构造器

@RequiredArgsConstructor:

  • 生成包含所有被 final 修饰符修饰的实例变量的构造方法
  • 如果没有final的实例变量,则自动生成无参数构造方法

@ToString / @EqualsAndHashCode:

  • 用于生成 toString 和 equals/hashCode 方法
  • 这两个注解都有exclude属性,通过这个属性可以定制toString、hashCode、equals方法

2.1如何使用 Lombok

2.1.1添加依赖

在 Maven 的 pom.xml 文件中添加 Lombok 依赖:

java 复制代码
<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.36</version>
</dependency>

2.1.2 使用Lombok注解

在 Java 类中使用 Lombok 提供的注解

java 复制代码
import lombok.Data;

@Data
public class User {
    private String name;
}
java 复制代码
public class Test {
    public static void main(String[] args) {
        User user = new User();
        user.setName("jackson");
        System.out.println(user.getName());
        System.out.println(user.toString());
        System.out.println(user.hashCode());
        User user2 = new User();
        user2.setName("jackson");
        System.out.println(user.equals(user2));
    }
}

执行结果如下:

注:Lombok只能帮助我们生成无参数构造方法和全参数构造方法,其他定制参数的构造方法无法生成。

2.1.3Lombok的其他常用注解

@Value

该注解会给所有属性添加final,给所有属性提供getter方法,自动生成toString、hashCode、equals

通过这个注解可以创建不可变对象。

java 复制代码
@Value
public class Customer {
    Long id;
    String name;
    String password;
}

Test

java 复制代码
public class CustomerTest {
    public static void main(String[] args) {
        Customer c1 = new Customer(1L, "jackson", "123");
        System.out.println(c1);
        System.out.println(c1.getId());
        System.out.println(c1.getName());
        System.out.println(c1.getPassword());
        System.out.println(c1.hashCode());
        Customer c2 = new Customer(1L, "jackson", "123");
        System.out.println(c1.equals(c2));
    }
}

执行结果如下:

@Builder
GoF23种设计模式之一:建造模式

建造模式(Builder Pattern)属于创建型设计模式。

用于解决对象创建时参数过多的问题。

它通过将对象的构造过程与其表示分离,使得构造过程可以逐步完成,而不是一次性提供所有参数。

建造模式的主要目的是让对象的创建过程更加清晰、灵活和可控。

简而言之,建造模式用于:

  1. 简化构造过程:通过逐步构造对象,避免构造函数参数过多。
  2. 提高可读性和可维护性:让构造过程更加清晰和有序。
  3. 增强灵活性:允许按需配置对象的不同部分。
    这样可以更方便地创建复杂对象,并且使得代码更加易于理解和维护。

建造模式的代码如下

java 复制代码
// 建造模式
public class Person {
    // 属性
    private final String name;
    private final int age;
    private final String email;

    // 私有的全参数构造方法
    private Person(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getEmail() {
        return email;
    }

    public static PersonBuilder builder() {
        return new PersonBuilder();
    }

    // 静态内部类
    public static class PersonBuilder {
        private String name;
        private int age;
        private String email;

        public PersonBuilder name(String name) {
            this.name = name;
            return this;
        }

        public PersonBuilder age(int age) {
            this.age = age;
            return this;
        }

        public PersonBuilder email(String email) {
            this.email = email;
            return this;
        }

        // 建造对象的核心方法
        public Person build() {
            return new Person(name, age, email);
        }
    }

    @Override
    public String toString() {
        return "Person{" + "name='" + name + '\'' + ", age=" + age + ", email='" + email + '\'' + '}';
    }

    public static void main(String[] args) {
        Person person = Person.builder()
                .name("jackson")
                .age(20)
                .email("[email protected]")
                .build();
        System.out.println(person);
    }
}

执行结果如下:

使用@Builder注解自动生成建造模式的代码
java 复制代码
@Data
@Builder
// 建造模式
public class Person {
    // 属性
    private String name;
    private int age;
    private String email;

    public static void main(String[] args) {
        Person person = Person.builder()
                .name("jackson")
                .age(20)
                .email("[email protected]")
                .build();
        System.out.println(person);
    }
}
@Singular

@Singular注解是辅助@Builder注解的。

当被建造的对象的属性是一个集合,这个集合属性使用@Singular注解进行标注的话,可以连续调用集合属性对应的方法完成多个元素的添加。

如果没有这个注解,则无法连续调用方法完成多个元素的添加。代码如下:

java 复制代码
@Data
@Builder
// 建造模式
public class Person {
    // 属性
    private final String name;
    private final int age;
    private final String email;
    // Singular翻译为:单数。表示一条一条添加
    @Singular("addPhone")
    private final List<String> phones;

    public static void main(String[] args) {
        Person person = Person.builder()
                .name("jackson")
                .age(20)
                .email("[email protected]")
                .addPhone("15222020214")
                .addPhone("14875421424")
                .addPhone("16855241424")
                .build();
        System.out.println(person);
    }
}

执行结果如下:

@Slf4j

Lombok 支持多种日志框架的注解,可以根据你使用的日志框架选择合适的注解。以下是 Lombok 提供的部分日志注解及其对应的日志框架:

  1. @Log4j:
    自动生成一个 org.apache.log4j.Logger 对象。
    适用于 Apache Log4j 1.x 版本。
  2. @Slf4j:
    自动生成一个 org.slf4j.Logger 对象。
    适用于 SLF4J(Simple Logging Facade for Java),这是一种日志门面,可以与多种实际的日志框架(如 Logback、Log4j 等)集成。
  3. @Log4j2:
    自动生成一个 org.apache.logging.log4j.Logger 对象。
    适用于 Apache Log4j 2.x 版本。
使用

假设我们有一个类 ExampleClass,并且我们想要使用 SLF4J 作为日志框架,我们可以这样使用 @Slf4j 注解:

java 复制代码
@Slf4j
public class UserService {
    public void login(){
        log.info("登录验证...");
    }
    // 测试
    public static void main(String[] args) {
        UserService userService = new UserService();
        userService.login();
    }
}

在这个例子中,log 是一个静态成员变量,表示一个 org.slf4j.Logger 对象。Lombok 自动生成了这个日志对象,并且你可以直接使用它来进行日志记录。

选择合适的注解

选择哪个注解取决于你使用的日志框架。例如:

● 如果你使用的是 SLF4J,可以选择 @Slf4j。

● 如果你使用的是 Log4j 1.x,可以选择 @Log4j。

● 如果你使用的是 Log4j 2.x,可以选择 @Log4j2。

相关推荐
北辰浮光几秒前
[SpringMVC]上手案例
java·开发语言
九转苍翎8 分钟前
Java虚拟机——JVM(Java Virtual Machine)解析二
java·jvm
顾林海19 分钟前
深度解析LinkedHashMap工作原理
android·java·面试
一路向北he29 分钟前
杰理10k3950温度测量
java·数据结构·算法
K哥112531 分钟前
【多线程】线程池
java·开发语言·线程池
LeicyII41 分钟前
面试题:Eureka和Nocas的区别
java·云原生·eureka
SoFlu软件机器人1 小时前
高并发秒杀系统设计:关键技术解析与典型陷阱规避
java·人工智能
码农小站1 小时前
MyBatis-Plus 表字段策略详解:@TableField(updateStrategy) 的配置与使用指南
java·后端
李憨憨1 小时前
深入探究MapStruct:高效Java Bean映射工具的全方位解析
java·后端