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方法的展现形式。
参数 | 默认值 | 作用 | 示例 |
---|---|---|---|
fluent | false | 若为true,那么setter方法就回返回一个自己的对象 | public PersonAccessors setName(String name) { this.name = name; return this; } |
chain | false | 若为true,setter返回是自己对象,然后getter和setter的方法名都是属性名字 | public String address() { return this.address; } public PersonAccessors name(String name){ this.name = name; return this; } |
prefix | 空 | prefix如果有的话,那就会忽略属性名字的前缀 | 例如@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的方法有很多,列表如下:
- @CommonsLog
- @Flogger
- @JBossLog
- @Log
- @Log4j
- @Log4j2
- @Slf4j
- @XSlf4j
Note:其他关于lombok注解的使用,详见官网
lombok的原理
原理我看了一些博客,理解了一些些;但是感觉有点疑惑,所以暂时就不写关于这个的,以防误人子弟。
找到一份Myths写的博客,感觉写的挺好的,可以参考一下。
实现原理顺序
- 源代码文件
- 编译
- 抽象语法书(AST)
- 注解编译器
- 自动编译匹配(modify AST)
小彩蛋
转载关于IDEA使用Lombok的方法,转载博客