目录
Lombok简介
Lombok可以在你开发时提供Lombok的相关注解,在运行时给你生成相应的代码。从而可以简化项目结构,同时提高项目开发的效率。
Lombok使用准备
在对应的IDE中安装Lombok插件
如果需要使用Lombok,你就必须安装你的Lombok插件,插件下载地址:https://projectlombok.org/download。这里可以下载到通用的Lombok插件安装工具。下载完后双击jar包会出现如下界面:
选择你需要安装的ide安装或者卸载即可。
添加Lombok依赖
项目中添加Lombok依赖(maven为例):
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
常用功能
- @Getter,生成get方法
- @Setter,生成set方法
- @ToString,生成toString方法
- @EqualsAndHashCode,生成hashcode和equals方法
- @Slf4j,在类开头生成日志模板代码
- @Data 整合@Getter、@Setter、@ToString
- @NoArgsConstructor 无参数构造方法
- @AllArgsConstructor所有属性构造方法
- @RequiredArgsConstructor 必要属性构造方法(final属性)
示例
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Data
@EqualsAndHashCode
@AllArgsConstructor
@RequiredArgsConstructor
@Slf4j
public class TestObj {
private String name;
private String mail;
private final String sex;
public static void main(String[] args) {
TestObj t = new TestObj("1");
t.setMail("123@123.com");
t.setName("name");
TestObj t1 = new TestObj("name", "123@123.com", "1");
log.info(t.toString());
log.info(t1.toString());
log.info(String.valueOf(t.equals(t1)));
log.info(t.getName());
}
}
上述代码是Lombok的简单示例,是不是挺简单呢。
上述代码运行结果:
16:58:03.891 [main] INFO com.test.web.TestObj - TestObj(name=name, mail=123@123.com, sex=1)
16:58:03.895 [main] INFO com.test.web.TestObj - TestObj(name=name, mail=123@123.com, sex=1)
16:58:03.895 [main] INFO com.test.web.TestObj - true
16:58:03.895 [main] INFO com.test.web.TestObj - name
当然更多Lombok的功能希望读本文的你可以自己去探索。
关于Lombok的一些陷阱
关于equal和hashcode的问题:
请参看如下例子:
Person.java
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Person {
private String name;
private String id;
}
Worker.java
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@EqualsAndHashCode
@Getter
@Setter
public class Worker extends Person {
private String job;
public static void main(String[] args) {
Worker worker = new Worker();
worker.setId("1");
worker.setName("test1");
worker.setJob("砖瓦匠");
Worker worker2 = new Worker();
worker2.setId("2");
worker2.setName("test2");
worker2.setJob("砖瓦匠");
System.out.println(worker.equals(worker2));
}
}
上述结果返回的是true,显然,worker和worker2不属于一个人,所以这里是有问题的,在新版本的ide中,会有个警告的提示:
Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.
意思是默认情况下,Lombok会认为你只比较当前类的属性,所以你需要添加属性:callSuper = true,但@Data并无此属性,所以慎用@Data。
具体的代码为:
@EqualsAndHashCode(callSuper = true)
所以个人其实不太建议使用Lombok的@Data注解和@EqualsAndHashCode注解。
违反了封装的原则
对于Lombok,如果生成了get与set方法,会把对象下的所有属性都生成对应的方法,这样如果有些属性你并不希望外界获取,就无法满足。最常见的一种设计就是类似集合,通常我们都会用一个add方法来添加元素,这样在其他类调用我的时候就只能做新增操作。如果其他类获取了我的list就可以做清空等操作,亦或者是你不希望外部去设置你这个属性的值(这种场景建议使用final属性,但设置成final属性又会生成对应的参数构造方法,也不是一个好的解决方案),Lombok同样会生成对应的set方法。示例代码如下:
package com.buss.data.bean;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Worker extends Person {
private String job;
public List<String> hobbies = new ArrayList<String>();
public void addHobby(String hobby) {
this.hobbies.add(hobby);
}
public static void main(String[] args) {
Worker worker = new Worker();
worker.addHobby("swing");
worker.getHobbies().clear();
System.out.println(worker.getHobbies());
}
}
如果你不希望出现这样的情况,那么Lombok可能对你来说不是一个好的选择。总的来说便利就会带来一些东西无法定制化。所以这些情况需要酌情考虑。
依赖性很强
如果项目使用了Lombok,那么你的项目成员的IDE都是必须安装Lombok插件的,这样其实是一种强侵入性的做法。