lombok详解

Lombok是一个Java库,通过注解方式简化代码,提升开发效率。它提供了一系列注解,如@Getter/@Setter、@Data、@NonNull等,用于自动生成getter、setter、equals、hashCode方法等。本文详细介绍了Lombok的常用注解及其用法,包括@Data的综合特性、构造方法、@EqualsAndHashCode的equals和hashCode方法、非空检查@NonNull、存取器@Accessors、构建器@Builder、委托@Delegate、同步注解@Synchronized以及日志注解@Log等。

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

lombok使用

lombok以注解的形式来简化代码,提高开发的开发效率;比如说getter和setter写的非常隆长,但是用了lomok以后就能源码中不出现getter和setter的方法,编译后在编译文件中自带。
引用maven依赖:

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

注解

Getter/Setter

这是最简单和最常用的注解,使用这两个注解相当于写了所有非final形容的属性的Getter和Setter的方法。

源码:

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class PersonGetterSetter {
    private String name;
    private String address;
    private final Integer age=22;

    public PersonGetterSetter(String name, String address) {
        this.name = name;
        this.address = address;
    }
}

编译后:

public class PersonGetterSetter {
    private String name;
    private String address;

    public PersonGetterSetter(String name, String address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return this.name;
    }

    public String getAddress() {
        return this.address;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
Data

Data注解集成了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的所有特性,简单残暴。

构造方法
方法解释
NoArgsConstructor无参数构造方法
AllArgsConstructor全参数构造方法
RequiredArgsConstructor选择参数构造方法
EqualsAndHashCode

EqualsAndHashCode提供了equals和hashCode方法。

NonNull

该注解使用在构造器或者是属性上,可以检验参数,避免NullPointerException错误。

源码:

import lombok.NonNull;

public class PersonNonNull {
    private String name;
    private String address;

    public PersonNonNull(@NonNull  String name, String address) {
        this.name = name;
        this.address = address;
    }
}

编译以后会在方法体内自动判断是不是空,如果是空就回自动抛错;这样就能避免空指针了。
编译后代码:

import lombok.NonNull;

public class PersonNonNull {
    private String name;
    private String address;

    public PersonNonNull(@NonNull String name, String address) {
        if (name == null) {
            throw new NullPointerException("name is marked @NonNull but is null");
        } else {
            this.name = name;
            this.address = address;
        }
    }
}
Accessors

Accessors翻译是存取器,通过该注解可以控制Getter和Setter方法的展现形式。

参数默认值作用示例
fluentfalse若为true,那么setter方法就回返回一个自己的对象public PersonAccessors setName(String name) {
this.name = name;
return this;
}
chainfalse若为true,setter返回是自己对象,然后getter和setter的方法名都是属性名字public String address() {
return this.address;
}
public PersonAccessors name(String name){
this.name = name;
return this;
}
prefixprefix如果有的话,那就会忽略属性名字的前缀例如@Accessors(prefix=“f”),那么属性名字为fName,fAddress的话,所有的getter和setter方法都会是getName和getAddress,需要遵循驼峰结构,如果不是的话那么不会生成相关的getter和setter方法
builder

builder类似于工厂函数中的builder,使用注解builder之后就能使用builder方法创建一个新的对象了。

PersonBuilder personBuilder=PersonBuilder.builder().name("zzz").address("shanghai").build();

编译后会生成一个内部的静态类,可以使用build;
编译后代码:

public static class PersonBuilderBuilder {
	private String name;
	private String address;
	
	PersonBuilderBuilder() {
	}
	
	public PersonBuilder.PersonBuilderBuilder name(String name) {
		this.name = name;
		return this;
	}
	
	public PersonBuilder.PersonBuilderBuilder address(String address) {
		this.address = address;
		return this;
	}
	
	public PersonBuilder build() {
		return new PersonBuilder(this.name, this.address);
	}
	
	public String toString() {
		return "PersonBuilder.PersonBuilderBuilder(name=" + this.name + ", address=" + this.address + ")";
	}
}
Delegate

Delegate使用在属性上,会帮我们生成许多常用的方法;最常使用在List的属性上面
Note:一个类只能使用一次@Delegate的注解,不然编译的时候会出现方法重复定义的错误
这个编译后的方法太长了,所以只能搞一个截图意思意思就好了。
在这里插入图片描述

Synchronized

这个注解是给方法加上同步锁。

log

这个注解也是比较常用的注解,只要加上这个注解就能使用log的方法了
如:log.info(“some strings”)
log的方法有很多,列表如下:

  1. @CommonsLog
  2. @Flogger
  3. @JBossLog
  4. @Log
  5. @Log4j
  6. @Log4j2
  7. @Slf4j
  8. @XSlf4j

Note:其他关于lombok注解的使用,详见官网

lombok的原理

原理我看了一些博客,理解了一些些;但是感觉有点疑惑,所以暂时就不写关于这个的,以防误人子弟。
找到一份Myths写的博客,感觉写的挺好的,可以参考一下。

实现原理顺序

  • 源代码文件
  • 编译
  • 抽象语法书(AST)
  • 注解编译器
  • 自动编译匹配(modify AST)

小彩蛋

转载关于IDEA使用Lombok的方法,转载博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值