开发神器-神奇插件Lombok让臃肿的java美眉得到新生
本文环境:java8 eclipse maven3.5 Springboot 2.0.1
Lombok是什么
lombok是一个神奇的开发插件,他能够通过简单的注解,来把代码中的重复大量的样板代码进行一个简单的替换,如set/get方法以及equals和hashCode实现等~。
Lombok的安装
两步进行插件的安装
1. Eclipse插件安装【idea安装只需要在插件市场里搜索lombox plugin 安装即可】
- jar包下载
- 官方下载,找到lombok版本中选择1.16.20进行下载,拷贝进项目中[本文采用maven导入,与拷贝区别不大]
- 下载地址:lombok all-versions
- 打开jar包
- 双击打开即可。
- 如果不可以打开就使用命令行打开 [java -jar lombok.jar]
- 打开之后安装
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DzCkCJ4J-1583563417326)(http://www.hdpz.xyz/upload/2020/2/image-45eb3bcd0da3483291477b6ed4ab6363.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j3A3rolo-1583563417326)(http://www.hdpz.xyz/upload/2020/2/image-d1dda9c3626a4b29958e8ca05ae48fef.png)] - 检查一下Eclipse是否安装成功
2. jar包引入
本文采用lombok 1.16.20版本
maven导入,拷贝进pom文件
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
Lombok怎么用 (常用注解)
Lombok以注释的方式使用,只需要在需要生成通用方法的地方加上对应的注释,即可快速的实现开发
@getter和@Setter
这两个注解分别生成Getter与Setter方法
//在属性上注解
public class UserGetterSetter {
// 在属性上注解,这样就会对应的生成get/set方法
@Getter @Setter
private String name;
@Getter @Setter
private Integer age;
}
//在类上注解,这样所有属性都会生成get/set方法
@Getter @Setter
public class UserGetterSetter {
private String name;
private Integer age;
}
@NonNull
这个注解会快速的检查当前值是否为空,如果为空则抛NullPointerException异常
public class UserNonNull {
// 用了@NonNull这个注解,在构造set等方法中都会进行非空判断
@Getter @Setter @NonNull
private String name;
}
@ToString
这个注解生成toString方法,如果需要排除输出属性可在内
// callSuper 是否输出超类属性方法,exclude排除某属性
@ToString(callSuper=true,exclude="interest")
public class UserToString extends UserGetterSetter{
private String sex="男";
private String interest="女";
}
@EqualsAndHashCode
这个注解生成equals和hashCode方法
// 与ToString注解用法基本相似
// callSuper 生成时是否包含超类,exclude排除某属性
@EqualsAndHashCode(callSuper=true,exclude= {"interest","money"})
public class UserEqualsAndHashCode extends UserGetterSetter{
private String sex="男";
private String interest="女";
private Double money=100.0;
}
@Data(非常常用)
这个注解最常用,它结合了功能成@ToString, @EqualsAndHashCode, @Getter和@Setter
//@Data
//@Data设置staticConstructor属性可以生成静态工厂方法,生成参数指定名称的静态工厂方法
@Data(staticConstructor="getUserData")
public class UserData{
private String name;
private Integer age;
private String sex="男";
private String interest="女";
private Double money=100.0;
}
@Cleanup
- @Cleanup注解,确保分配资源被释放。
- 使用时要考了清理会不会引发异常,如果引发了,由于使用了@Cleanup注解问题会被埋藏起来,看日志报错很难找到根源。
public class CleanupTest {
// 实现资源释放
// 加注解
public void testCleanUpLombox() {
try {
@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(new byte[] {'Y','e','s'});
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
// 原始方式
public void testCleanUp() {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(new byte[]{'Y', 'e', 's'});
System.out.println(baos.toString());
} finally {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@synchronized
这个注解作用是快速生成线程同步的模版。在方法上使用整个方法线程安全。也可以在对象上使用,会造成死锁。不建议在变量上使用。
public class SynchronizedTest{
// 使用注解
@Synchronized
public void synchronizedTestLombox() {
System.out.println("----1-----");
System.out.println("----2-----");
System.out.println("----3-----");
System.out.println("----木-----");
System.out.println("----头-----");
System.out.println("----人-----");
}
// 不使用注解
private final java.lang.Object $lock = new java.lang.Object[0];
public void synchronizedTest() {
synchronized ($lock) {
System.out.println("----1-----");
System.out.println("----2-----");
System.out.println("----3-----");
System.out.println("----木-----");
System.out.println("----头-----");
System.out.println("----人-----");
}
}
}
@Slf4j (非常常用)
快速生成日志模版, 最好用的注解之一,与@Data并驾齐驱
只需要在类的开头加上注解,就ok了,记得加上日志依赖,本文使用的是SpringBoot默认日志框架logback
@Slf4j
public class Slf4jTest {
public void testSlf4j() {
log.debug("这是debug");
log.info("这是Info");
log.error("这是error");
Integer errorCode = 11;
log.error("这是error 错误代号={}", errorCode);// 传入值为object,打印时中括号会背代替掉
}
}
@Accessors(chain = true)
链式编程注解,该注解打在bean上。
@Data
@Accessors(chain = true)
public class AccessorsTest {
private String name;
private int age;
public static void main(String[] args) {
AccessorsTest accessorsTest = new AccessorsTest().setName("黄大胖子").setAge(99);
}
}