三、Lombok注解使用案例

Lombok是一个Java库,提供了一系列注解,用于减少样板代码。@NoArgsConstructor、@AllArgsConstructor、@Getter、@Setter等注解用于自动生成构造函数、getter和setter。@Data提供全属性的getter、setter、equals、hashCode等方法。@Builder用于构建者模式,@Synchronized生成同步方法,@NonNull进行空值检查。@Wither和@With生成with方法,用于创建对象副本。@Cleanup自动调用close方法关闭资源。@Log系列注解简化日志记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注解说明

Lombok提供了很多注解用于生成Java代码,主要存放于experimental、extern、lombok包下。
官方文档
在这里插入图片描述

experimental

experimental翻译为试验性,顾名思义,当前包下的一些注解处于试用阶段,不推荐使用,这里只做简单介绍。

注解使用说明
@Accessors配置lombok如何生成和查找getter和setter,比如链式编程设置属性值
@Delegate可以对任何字段或无参数方法进行注释,@Delegate以使lombok生成将调用转发给该字段的委托方法(或调用该方法的结果)
@ExtensionMethod可以创建包含了一堆的类public,static方法,它都以至少1个参数。这些方法将使用该@ExtensionMethod功能扩展第一个参数的类型,就像它们是实例方法一样。
@ FieldDefaults所述@FieldDefaults注释可以添加一个访问修饰符(public,private,或protected在带注释的类或枚举)到每个字段。它也可以添加final到带注释的类或枚举中的每个字段中。
@FieldNameConstants该@FieldNameConstants注释生成包含用于在你的类的每个字段1个恒定的内型; 字符串常量(标记为public static final,类型为的字段java.lang.String),或者根据需要为每个字段使用1值的枚举类型-编写@FieldNameConstants(asEnum = true)枚举变量。@FieldNameConstants对于各种编组和序列化框架很有用。除非您lombok.fieldNameConstants.uppercase = true在lombok.config文件中设置了该选项,否则常量字段(无论是枚举值还是字符串常量)的名称始终与字段,大小写以及所有名称完全相同。
@Helper该注释使您可以将方法放入方法中。
@NonFinal用于指示被注释实体不是为 final
@PackagePrivatepackage private访问级别
@StandardException放置任何扩展了某些{@code java.lang.Throwable}类型的类,以添加4个常见异常构造函数
@SuperBuilder该@SuperBuilder标注生产络合剂的API为你的类。与相比@Builder,@SuperBuilder还可与超类的字段一起使用。但是,它仅适用于类型。最重要的是,它要求所有超类也都具有@SuperBuilder注释。
@Tolerate任何方法或构造函数都可以用注释,@Tolerate并且lombok会像它不存在一样起作用。
@UtilityClass实用程序类无法实例化。通过用标记您的类@UtilityClass,lombok将自动生成一个引发异常的私有构造函数,将您添加的任何显式构造函数标记为错误,并标记该类final。如果该类是内部类,则该类也会被标记static。
@var该类型仍然完全从强制性初始化程序表达式派生,并且任何进一步的赋值(现在都是合法的)(因为该变量不再final)都没有考虑确定合适的类型。
@WithBy不变属性的二传手的第二个最佳选择是构造对象的副本,但为该字段添加一个新值。产生此克隆的方法正是@With产生的withFieldName(newValue)方法:一种产生克隆的方法,但关联字段的新值除外。
@ Wither放在任何字段上以使lombok生成“ wither”-一种withX方法,该方法会生成此对象的副本(除了1个字段会获得新值)

extern

extern包中,主要是针对日志,将@Logclass的变体放在您的类上(适用于任何日志记录框架),然后可以直接使用log对象打印日志。

@Slf4j
public class TestService {

    public void testValid(User user) {
        log.info("lombok");
        System.out.println("TestService");
    }
}
注解使用说明
@CommonsLog生成private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class)
@Floggerprivate static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();
@Jacksonized该@Jacksonized注释是一个附加注释的@Builder和@SuperBuilder。它会自动配置生成的生成器类,以供Jackson的反序列化使用。它只有在还存在a@Builder或a的上下文中出现时才起作用@SuperBuilder。否则会发出警告。
@Logprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@JBossLogprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.cla
@Log4jprivate static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
@ Log4j2private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4jprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4jprivate static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class)

lombok

lombok包下的注解为常用注解

注解使用说明
@AllArgsConstructor全参构造函数
@Builder生成构造者模式,方便对属性 set/get 操作
@Cleanup自动调用变量的 close 方法释放资源
@CustomLog使lombok生成基于自定义记录器实现的记录器字段
@Data提供类的get、set、equals、hashCode、canEqual、toString方法
@Delegate此处列出的任何类型(包括超类型)中的每个方法都不会被过时。注意:中的所有方法Object,以及canEqual(Object other)将永远不会被过时。
@EqualsAndHashCode提供对应的 equals 和 hashCode 方法
@GeneratedLombok最终将自动将此注释添加到所有生成的构造函数,方法,字段和类型中。对于所有代码样式和错误查找工具,您都可以将该注释的存在标记为“忽略它”。
@Getter提供 get 方法
@ NoArgsConstructor无参构造函数
@NonNull自动生成空值校验
@RequiredArgsConstructor必须参数构造函数
@Setter提供 set 方法
@Singular与@Builder在集合的生成器中创建单个元素的“ a​​dd”方法。
@SneakyThrows大胆地抛出以前没有人抛出过的检查异常!
@Synchronized自动生成同步锁
@ToString提供 ToString 方法
@ val使用val任何局部变量声明的类型(甚至在换每个语句),和类型将从初始化表达来推断。
@Value生成大量代码,这些代码适合于表示不可变实体的类。
@var轻松的局部变量
@With放置任何字段以使lombok生成一个“ with”-一种withX方法,该方法会生成此对象的副本(除了1个字段会获得新值)。

常用注解案例

IDE添加了lombok插件后,创建项目,引入pom就可以开始使用了

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

创建一个实体类用于测试

public class Person {
    private Integer personId;
    private String name;
    private Integer age;
    private String num;
}

@ NoArgsConstructor

为类提供一个无参的构造方法。

当类中有 final 字段没有被初始化时,编译器会报错,此时可用 @NoArgsConstructor(force = true),然后就会为没有初始化的 final 字段设置默认值 0 / false / null。

对于具有约束的字段(例如 @NonNull 字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。

@NoArgsConstructor
public class Person {
    private Integer personId;
    private String name;
    private Integer age;
    private String num;
}

@RequiredArgsConstructor

注解在类上,会生成构造方法(可能带参数也可能不带参数)。

该注解还可以用 @RequiredArgsConstructor(staticName=“methodName”) 的形式生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象。
在这里插入图片描述

@AllArgsConstructor

此注解会为实体类生成一个全参构造方法,还可以AccessLevel指定修饰符,默认public。

@AllArgsConstructor(access= AccessLevel.PUBLIC)
public class Person {
    private Integer personId;
    private String name;
    private Integer age;
    private String num;
}
Person person = new Person(111, "bbb", 17, "ccc");

编译后文件:
在这里插入图片描述

@Builder

构建者模式,创建一个构建者,通过builder().build()方法创建对象。

@Builder
@AllArgsConstructor(access= AccessLevel.PUBLIC)
public class Person

Person person1 = Person.builder().age(18).name("ww").personId(112).num("bbb").build();

在这里插入图片描述

@Cleanup

以使用@Cleanup注解确保代码执行路径退出当前作用于时清除制定资源。在该作用域的末尾将调用close()方法,并使用了try/finally代码块确认该方法一定执行。

        @Cleanup InputStreamReader sr = new InputStreamReader(new FileInputStream(new File("E:\\github\\lombok-master\\README.md")));
        int temp = 0;
        while ((temp = sr.read()) != -1)
        {
            System.out.print((char)temp);
        }

在这里插入图片描述

@Data

提供类的getter、setter、equals、hashCode、canEqual、toString方法

@Data
@Builder
@AllArgsConstructor(access= AccessLevel.PUBLIC)
public class Person {
    private Integer personId;
    private String name;
    private Integer age;
    private String num;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@EqualsAndHashCode

当其注解在类上,为该类提供 hashCode() 和 equals() 方法。

@EqualsAndHashCode
public class Person {
    private Integer personId;
    private String name;
    private Integer age;
    private String num;
}

@Generated

@Getter

自动生成getter方法,如果是用在类上:则为这个类所有属性供 setter 和 getter方法,如果用在属性上:则只为该属性提供 setter 和 getter 方法。

@Getter
@Builder
@AllArgsConstructor(access= AccessLevel.PUBLIC)
public class Person {
    private Integer personId;
    private String name;
    private Integer age;
    private String num;
}

在这里插入图片描述

@Setter

自动生成setter方法

@Getter
@Setter
@Builder
@AllArgsConstructor(access= AccessLevel.PUBLIC)
public class Person {
    private Integer personId;
    private String name;
    private Integer age;
    private String num;
}

在这里插入图片描述

@NonNull

注解在属性上,标识属性是不能为空,为空则抛出异常。换句话说就是进行空值检查。

    public static void test(@NonNull String name) {
        System.out.println();
    }

在这里插入图片描述

@SneakyThrows

大胆抛出已检查的异常,比如之前打印文件的代码,方法中没有throws异常时,代码会爆红。
在这里插入图片描述
使用@SneakyThrows,可以将方法中的代码用 try-catch 语句包裹起来,捕获异常并在 catch 中用 Lombok.sneakyThrow(e) 把异常抛出。也可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常。
在这里插入图片描述
在这里插入图片描述

@Synchronized

创建一个互斥锁,保证此时没有其它线程对锁代码块进行操作,保证线程的安全性。@Synchronized 的锁对象分别是“私有静态 final 对象 lock”和“私有 final 对象 lock”。当然,也可以自己指定锁对象。

    @Synchronized
    public static void syncCode() {
        int i = 0;
        i++;
        System.out.println(i);
    }

在这里插入图片描述

@ToString

@ToString
public class Person {
    private Integer personId;
    private String name;
    private Integer age;
    private String num;
}
Person person = new Person(111, "bbb", 17, "ccc");
System.out.println(person);

在这里插入图片描述

var和val

val、val 关键字可以让我们在定义一个变量时候不需要提前指定它的类型,它的实际的类型将由初始化的表达式推断。

        var person = new Person(111, "bbb", 17, "ccc");
        val person222 = new Person(111, "bbb", 17, "ccc");

@Value

@Value 注解和 @Data 类似,区别在于它会把所有成员变量默认定义为 private final 修饰,并且不会生成 set() 方法。

@Value
public class Person {
    Integer personId;
    String name;
    Integer age;
    String num;
}

在这里插入图片描述

@With

@With 可以使用在类上,也可以使用在成员变量上。加在类上相当于给所有成员变量 @With。

    @With(AccessLevel.PUBLIC)
    Integer personId;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨 禹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值