简介
lombok
是一个编译级别的插件,它可以在项目编译的时候生成一些代码。比如日常开发过程中需要生产大量的javabean
文件,每个javabean
都需要提供大量的get
和set
方法,如果字段较多且发生变动的话修改起来相对繁琐,相应的lombok
可以通过注解(@getter,@setter)
为我们省去手动创建getter
和setter
方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter
和setter
方法。
即它最终能够达到的效果是:在源码中没有getter
和setter
方法,但是在编译生成的字节码文件中有getter
和setter
方法。
另外在项目开发阶段,一个class
的属性是一直变化的,今天可能增加一个字段,明天可能删除一个字段。每次变化都需要修改对应的模板代码。另外,有的class
的字段超级多,多到一眼看不完。如果加上模板代码,更难一眼看出来。更有甚者,由于字段太多,想要使用builder
来创建。手动创建builder
和字段和原来的类夹杂在一起,看起来很凌乱。lombok
的@builder
即可解决这个问题。
官网地址:https://projectlombok.org/
lombok最新版本号:http://jcenter.bintray.com/org/projectlombok/lombok/
官方文档: https://projectlombok.org/features/all
lombok 注解介绍:http://www.zzvips.com/article/157124.html
安装 lombok 插件
添加注解支持
添加依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
buildscript {
ext {
springbootversion = '2.0.2.release'
}
repositories {
mavencentral()
}
dependencies {
classpath( "org.springframework.boot:spring-boot-gradle-plugin:${springbootversion}" )
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.yanjun'
version = '0.0.1-snapshot'
sourcecompatibility = 1.8
repositories {
mavencentral()
}
dependencies {
compile( 'org.springframework.boot:spring-boot-starter' ,
'org.springframework.boot:spring-boot-starter-web' ,
)
//添加lombok依赖
compile 'org.projectlombok:lombok:1.18.0'
}
|
常用注解
- @data 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canequal、hashcode、tostring 方法
- @setter :注解在属性上;为属性提供 setting 方法
- @setter :注解在属性上;为属性提供 getting 方法
- @log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
- @noargsconstructor :注解在类上;为类提供一个无参的构造方法
- @allargsconstructor :注解在类上;为类提供一个全参的构造方法
- @cleanup : 可以关闭流
- @builder : 被注解的类加个构造者模式
- @synchronized : 加个同步锁
- @sneakythrows : 等同于try/catch 捕获异常
- @nonnull : 如果给参数加个这个注解 参数为null会抛出空指针异常
- @value : 注解和@data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。
@nonnull 判空处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package com.yanjun.mybatis.bean;
import lombok.data;
import lombok.noargsconstructor;
import lombok.nonnull;
@data
@noargsconstructor
public class user {
public integer age;
@nonnull
public string name;
}
|
相当于
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package com.yanjun.mybatis.bean;
import lombok.nonnull;
public class user {
public integer age;
@nonnull
public string name;
public integer getage() {
return this .age;
}
@nonnull
public string getname() {
return this .name;
}
public void setage(integer age) {
this .age = age;
}
public void setname( @nonnull string name) {
if (name == null ) {
throw new nullpointerexception( "name is marked @nonnull but is null" );
} else {
this .name = name;
}
}
}
|
测试
1
2
|
user user = new user();
user.setname( null );
|
效果
exception in thread "main" java.lang.nullpointerexception: name is marked @nonnull but is null
at com.yanjun.mybatis.bean.user.setname(user.java:7)
at com.yanjun.mybatis.lombokapplication.main(lombokapplication.java:15)
@data 提供 get、set 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.yanjun.mybatis.bean;
import lombok.data;
@data //自动生成 get、set 方法
public class user {
integer id;
string name;
integer age;
public static void main(string[] args) {
//测试方法
user user = new user();
user.setname( "zhaoyanjun" );
user.setage( 20 );
user.setid( 1 );
}
}
|
@slf4j 日志打印
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package com.yanjun.mybatis.bean;
import lombok.data;
import lombok.extern.slf4j.slf4j;
@data //自动生成 get、set 方法
@slf4j //日志打印
public class user {
integer id;
string name;
integer age;
public static void main(string[] args) {
user user = new user();
user.setname( "zhaoyanjun" );
user.setage( 20 );
user.setid( 1 );
log.info( "日志" + user.tostring());
}
}
|
@allargsconstructor 全参数构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.yanjun.mybatis.bean;
import lombok.allargsconstructor;
import lombok.data;
import lombok.extern.slf4j.slf4j;
@data //自动生成 get、set 方法
@allargsconstructor //自动生成全参数构造函数
@slf4j //日志打印
public class user {
integer id;
string name;
integer age;
public static void main(string[] args) {
user user = new user( 1 , "zhaoyanjun" , 20 );
log.info( "日志" + user.tostring());
}
}
|
@tostring 自动生成tostring方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package com.yanjun.mybatis.bean;
import lombok.allargsconstructor;
import lombok.data;
import lombok.tostring;
import lombok.extern.slf4j.slf4j;
@data //自动生成 get、set 方法
@allargsconstructor //自动生成全参数构造函数
@slf4j //日志打印
@tostring (of = { "id" , "age" }) //tostring() 方法里面只打印 id ,name 字段
public class user {
integer id;
string name;
integer age;
public static void main(string[] args) {
user user = new user( 1 , "zhaoyanjun" , 20 );
log.info( "日志" + user.tostring());
}
}
|
tostring() 方法排除字段
1
2
|
//排除字段
@tostring (exclude = { "name" }) //tostring() 方法中,name 字段不参与打印
|
@value 用于注解final类
@value
注解和@data
类似,区别在于它会把所有成员变量默认定义为 private final
修饰,并且不会生成set
方法。
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.yanjun.mybatis.bean;
import lombok.value;
@value
public class user {
integer id = 1 ;
string name = "zhaoyanjun" ;
integer age = 3 ;
}
|
编译后的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public final class user {
private final integer id = 1 ;
private final string name = "zhaoyanjun" ;
private final integer age = 3 ;
public user() {
}
public integer getid() {
return this .id;
}
public string getname() {
this .getclass();
return "zhaoyanjun" ;
}
public integer getage() {
return this .age;
}
//省略部分代码
......
}
|
@builder : 被注解的类加个构造者模式
1
2
3
4
5
6
7
8
9
10
11
|
import lombok.builder;
@builder
public class user {
public integer id;
public string name;
public integer age;
}
|
相当于以下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
package com.yanjun.mybatis.bean;
public class user {
public integer id;
public string name;
public integer age;
user(integer id, string name, integer age) {
this .id = id;
this .name = name;
this .age = age;
}
public static user.userbuilder builder() {
return new user.userbuilder();
}
public static class userbuilder {
private integer id;
private string name;
private integer age;
userbuilder() {
}
public user.userbuilder id(integer id) {
this .id = id;
return this ;
}
public user.userbuilder name(string name) {
this .name = name;
return this ;
}
public user.userbuilder age(integer age) {
this .age = age;
return this ;
}
public user build() {
return new user( this .id, this .name, this .age);
}
public string tostring() {
return "user.userbuilder(id=" + this .id + ", name=" + this .name + ", age=" + this .age + ")" ;
}
}
}
|
使用
1
2
3
4
5
6
7
8
|
userbuilder userbuilder = user.builder();
user user = userbuilder
.age( 10 )
.id( 1 )
.name( "yanjun" )
.build();
system.out.println( ": " + userbuilder.tostring());
|
@synchronized : 加个同步锁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.yanjun.mybatis.bean;
import lombok. synchronized ;
public class user {
public integer age;
public string name;
//普通方法,相当于对象锁
@synchronized
int run1() {
return 1 ;
}
//静态方法,相当于类锁
@synchronized
static int run2() {
return 2 ;
}
}
|
代码的效果相当于
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class user {
private final object $lock = new object[ 0 ];
private static final object $lock = new object[ 0 ];
public integer age;
public string name;
public user() {
}
int run1() {
object var1 = this .$lock;
synchronized ( this .$lock) {
return 1 ;
}
}
static int run2() {
object var0 = $lock;
synchronized ($lock) {
return 2 ;
}
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/zhaoyanjun6/article/details/80743302