1 lom介绍与基本使用

https://zhuanlan.zhihu.com/p/32779910

lombok概念和基本使用,看这一篇就足够了

2 lombok 注意点

2.1 lombok自动生成方法可以混合自己写的方法

​ 见以下代码

@Getter
@Setter
public class FishermanDemo { private String username;
private Integer time; public String getUsername(){
System.out.println("hello world");
return "hello username";
} public void setTime(Integer time){
System.out.println("hello time");
this.time = time;
}
}

编译后的class文件

public class FishermanDemo {
private String username;
private Integer time; public FishermanDemo() {
} public String getUsername() {
System.out.println("hello world");
return "hello username";
} public void setTime(Integer time) {
System.out.println("hello time");
this.time = time;
} public Integer getTime() {
return this.time;
} public void setUsername(String username) {
this.username = username;
}
}

我们可以看出,lombok编译后的代码不会覆盖我们自己写的getter/setter方法。一般情况下,我们不会自己写getter/setter方法,但是也有些特殊的地方。比如POJO对象如果有时间类型,并且保存的类型和数据库字段不一致,那么这个时候就需要自己定义该时间类型的getter/setter方法,因为像Mybatis这样的框架是通过getter/setter方法来获取和注入值的。

2.2 尽量不要使用@Data

我们看源文件

@Data
public class FishermanDemo { private String username;
private Integer time; }

反编译后的文件

public class FishermanDemo {
private String username;
private Integer time; public FishermanDemo() {
} public String getUsername() {
return this.username;
} public Integer getTime() {
return this.time;
} public void setUsername(String username) {
this.username = username;
} public void setTime(Integer time) {
this.time = time;
} public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof FishermanDemo)) {
return false;
} else {
FishermanDemo other = (FishermanDemo)o;
if (!other.canEqual(this)) {
return false;
} else {
Object this$username = this.getUsername();
Object other$username = other.getUsername();
if (this$username == null) {
if (other$username != null) {
return false;
}
} else if (!this$username.equals(other$username)) {
return false;
} Object this$time = this.getTime();
Object other$time = other.getTime();
if (this$time == null) {
if (other$time != null) {
return false;
}
} else if (!this$time.equals(other$time)) {
return false;
} return true;
}
}
} protected boolean canEqual(Object other) {
return other instanceof FishermanDemo;
} public int hashCode() {
int PRIME = true;
int result = 1;
Object $username = this.getUsername();
int result = result * 59 + ($username == null ? 43 : $username.hashCode());
Object $time = this.getTime();
result = result * 59 + ($time == null ? 43 : $time.hashCode());
return result;
} public String toString() {
return "FishermanDemo(username=" + this.getUsername() + ", time=" + this.getTime() + ")";
}
}

我们可以看到 反编译后的文件有 getter/setter、无参构造器、equal、hascode、toString。我们经常使用的POJO对象一般只有getter/setter、无参构造器、有参数构造器、toString。因此我们可以用以下5个注解。

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString

2.3 属性不要使用基本类型

这个属于POJO对象基本约束规范,不要使用基本数据类型。

lombok对基本数据类型boolean反编译后的结果和Boolean类型有一些不一致。

假设private boolean sex, boolean基本类型sex的getter/setter方法如下,isSex和setSex,而Boolean就是正常的getSex和setSex

2.4 小心@ToString

使用lombok的注解 @ToString 打印出来的结果如下:

Student(name=Mahesh, age=21) // name后面的值  没有''

而使用IDEA 自动生成的toString方法 打印出来的结果如下:

Student{name='Mahesh', age=21} // name 后面的值 有''

可以看出来,IDEA自动生成的ToString方法,如果属性是字符串,那么调用toString方法的时候,会比lombok的toString方法多一个 ''

3 lombok 缺陷

使用lombok有一个最大的缺陷,就是在团队中所有开发人员都需要安装相关的lombok插件

4 lombok 底层原理

lombok很神奇,很我们以往使用jar包完全不一样,它必须要求开发工具安装相应的jar包,原因就是跟lombok底层实现原理有很大的关系。

lombok利用JSR269 api(Pluggable Annotation Processing API )创建编译期的注解处理器,注意所有的@Getter、@Setter、@Data、@ToString方法都是编译期注解 @Retention(RetentionPolicy.SOURCE)

这跟springboot等在运行期间利用反射获取注解相关的值完全不一样。而lombok能够在编译期就完成这些不可思议的工作,完全是因为JSR269的规范,允许在编译时指定一个processor类来对编译阶段的注解进行干预。

简单一句话,通过JSR269规范,允许你对一个类,在编译期间进行相应的更改,比如增加一些方法。

因此相关的开发工具例如IDEA、Eclipse完全不知道这些方法的存在

@Getter
public class FishermanDemo {
private String username;
}

反编译后的class文件

public class FishermanDemo {
private String username; public FishermanDemo() {
} public String getUsername() {
return this.username;
}
}

如果这个时候直接调用getUsername()

FishermanDemo fishermanDemo = new FishermanDemo();
fishermanDemo.getUsername();

开发工具的编译期会报错,因为他们完全不知道getUsername()方法的存在,因此必须安装相关的lombok插件,才能使开发工具不报错。

参考资料:
https://blog.mythsman.com/2017/12/19/1/#more
https://zhuanlan.zhihu.com/p/32779910

作者:一杯热咖啡AAA

出处:https://www.cnblogs.com/AdaiCoffee/

本文以学习、研究和分享为主,欢迎转载。如果文中有不妥或者错误的地方还望指出,以免误人子弟。如果你有更好的想法和意见,可以留言讨论,谢谢!

最新文章

  1. 移动端访问PC站点时自动跳转至移动站点
  2. 建筑材料系统 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发
  3. WebMethod在webservice里面非静态方法能调用,在页面类里面,静态方法才能调用
  4. Maven与Ant使用reportNG代替testng
  5. spring mvc流转控制说明
  6. Quest Central for DataBase 5.0.1,6.1 (软件+注册)
  7. requesting java ast from selection
  8. 自动化测试(四):VBScript脚本语言
  9. [Head First Python]4. summary
  10. HDOJ-1010 Tempter of the Bone(dfs+剪枝)
  11. 团队作业8——第二次项目冲刺(Beta阶段)Day5--5.23
  12. ElasticSearch 学习记录之ES几种常见的聚合操作
  13. "Uncaught object angular.js:36"诡异错误
  14. scala查询dataFrame结构
  15. 电子产品使用感受之-- AirPods + Apple Watch S4 = Smart iPod ?
  16. 妙用valueForKeyPath
  17. 玩转BLE(3)_使用微信蓝牙精简协议伪造记步数据
  18. 20155339 Exp3 免杀原理与实践
  19. nodejs文件上传组件multer使用
  20. VUE知识day2

热门文章

  1. VUE、微信for动态变量取值(拼接取值)
  2. tar 命令参数解释
  3. Appium+python自动化(十三)- 输入中文 - 一次填坑记(超详解)
  4. MediatR一个.net中简单好用的中介者模式实现方案
  5. Appium+python自动化(十三)- 与Capability完美懈垢之解读(超详解)
  6. 分布式全局ID生成方案
  7. Arrays工具类常用方法演示
  8. 02-三种Bean装配机制(三)
  9. 前端Web浏览器基于Flash如何实时播放监控视频画面(一)之获取监控摄像头的RTSP流
  10. Hive入门(四)查询优化