Lombok使用及注解详解

Lombok依赖和插件的关系:

依赖中被你调用过的函数会与你的代码一起进行编译。对于插件来说呢,比如有些插件是帮助你进行编译工作的,你不用手动写。比如lombok依赖是为了方便用里面的注解@Data等,lombok插件是为了编译这些注解的,识别这些注解。

Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的Java类。但是优缺点很明显

使用步骤:

1.在IDEA中安装Lombok插件

2.在项目中导入lombok的jar包

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

3、lombok的所有注解

常用注解

Lombok是一个Java库,它提供了一组注解,用于减少Java代码中的样板代码(boilerplate code)。以下是一些常用的Lombok注解:

  1. @Getter和@Setter: 自动生成类的Getter和Setter方法,可以应用于字段或类级别。
  2. @ToString: 自动生成 toString()方法,包括类的所有字段。
  3. @EqualsAndHashCode: 自动生成 equals()和 hashCode()方法,基于类的所有非静态、非transient字段。
  4. @NoArgsConstructor: 自动生成无参构造函数。
  5. @RequiredArgsConstructor: 自动生成包含必填字段的构造函数。

RequiredArgsConstructor是什么?
Lombok中的一个@RequiredArgsConstructor,简化了一些@Autowired注解,主要的功能就是可以减少@Autowired的书写,我们在写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码看起来很繁琐。

总结:类上加上@RequiredArgsConstructor,需要注入的类要用final声明。

@RequiredArgsConstructor详解(参考)

  1. @AllArgsConstructor: 自动生成包含所有字段的构造函数。
  2. @Data: 结合@Getter、@Setter、@ToString、@EqualsAndHashCode和@AllArgsConstructor的功能,提供了一个全能注解,适用于数据类。
  3. @Builder: 自动生成Builder模式的构造器,允许使用链式调用来创建对象。
  4. @Value: 与@Data类似,但生成的类是不可变的(immutable)。
  5. @Slf4j: 自动生成SLF4J的日志记录器(Logger)。
  6. @Log: 自动生成其他日志记录器,如java.util.logging或Apache Log4j。
  7. @Cleanup: 自动生成资源关闭语句,通常用于自动关闭流或数据库连接。
  8. @SneakyThrows: 将受检异常转换为未受检异常,使得在方法中可以抛出受检异常而无需在方法签名中声明。
  9. @NonNull: 标记字段或参数为非空,Lombok会生成相应的null检查代码。
  10. @Value.Immutable: 用于生成不可变的值对象,结合了@Value和@Builder的特性。

 @EqualsAndHashCode 注解:

1. 此注解会生成equals(Object other) 和 hashCode()方法。
2. 它默认使用非静态,非瞬态的属性
3. 可通过参数exclude排除一些属性
4. of 用来指明你要用什么字段来重写equals和hashcode
5. 它默认仅使用该类中定义的属性且不调用父类的方法
6. 可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。callSuper 这个选项只能用在有父类情况下,如上图如果没有Father那么会报错。默认是false,当改成true后,会调用父类的equals方法

通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且默认不会使用父类的属性,这就导致了可能的问题。
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。

修复此问题的方法很简单:
1. 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。
2. 或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。

举例:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private String password;
}

在这里插入图片描述

Lombok @Accessors链式编程

最近看到代码里面有@Accessors注解,看了一些文章没理解,这个一看就能懂:

@Accessors(chain=true)

链式访问,该注解设置chain=true,生成setter方法返回this(也就是返回的是对象),代替了默认的返回void。

package com.pollyduan;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain=true)
public class User {
    private Integer id;
    private String name;
    private Integer age;

    public static void main(String[] args) {
        //开起chain=true后可以使用链式的set
        User user=new User().setAge(31).setName("pollyduan");//返回对象
        System.out.println(user);
    }

}

@Accessors(fluent = true)

与chain=true类似,区别在于getter和setter不带set和get前缀。

package com.pollyduan;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(fluent=true)
public class User {
    private Integer id;
    private String name;
    private Integer age;

    public static void main(String[] args) {
        //fluent=true开启后默认chain=true,故这里也可以使用链式set
        User user=new User().age(31).name("pollyduan");//不需要写set
        System.out.println(user);
    }

}

@Accessors(prefix = "f")

set方法忽略指定的前缀。不推荐大神们这样去命名。

package com.pollyduan;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(prefix = "f")
public class User {
    private String fName = "Hello, World!";

    public static void main(String[] args) {
        User user=new User();
        user.setName("pollyduan");//注意方法名
        System.out.println(user);
    }

}



 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐