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/

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

终极CRUD-2-用lombok提高开发效率的更多相关文章

  1. Spring Boot2 系列教程 (三) | 使用 LomBok 提高开发效率

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 上周去了开年会,去的地方是温泉度假村.老实说,我是无感的,90% 是因为没中奖(老板太抠,两百人只抽三个奖),10 ...

  2. 基于SpringBoot从零构建博客网站 - 整合lombok和mybatis-plus提高开发效率

    在上一章节中<技术选型和整合开发环境>,确定了开发的技术,但是如果直接这样用的话,可能开发效率会不高,为了提高开发的效率,这里再整合lombok和mybatis-plus两个组件. 1.l ...

  3. 【IDEA】(3)---非常实用提高开发效率和水平的插件

    IDEA(3)-Mac中IDEA插件 IDEA提供了许多很实用的插件,能够大大提高开发效率和开发水平,这里列举几个很实用的插件. 说明:这边的IDEA是MAC系统. 一.插件管理界面简介 1.界面位置 ...

  4. IDEA提高开发效率的7个插件

    IDEA提高开发效率的7个插件 1. 多行编辑 先来体验一下从xml文件拷贝字段新建实体对象 一般我们为了新建多表连接后映射的 ResultMap ,耗费不少时间,那么我们就来试一试这个多行编辑 表字 ...

  5. 如何利用 Visual Studio 自带工具提高开发效率

    Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...

  6. 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式

    在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...

  7. 善用VS中的Code Snippet来提高开发效率

    http://www.cnblogs.com/anderslly/archive/2009/02/16/vs2008-code-snippets.html http://www.cnblogs.com ...

  8. 实用手册:130+ 提高开发效率的 vim 常用命令

    Vim 是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器.这里收录了130+程 ...

  9. 提高开发效率的 Eclipse 实用操作

    工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...

  10. 10 款提高开发效率的 jQuery/CSS3 组件

    前端开发是一项十分繁琐而又耗体力的工作,如何更有效率的开发我们的应用,很多人会选择适当地使用一些jQuery插件.今天就要给大家分享10款可以提高开发效率的jQuery/CSS3组件.部分插件可以下载 ...

随机推荐

  1. Spring_two

    Spring_two 基于注解的IOC配置 准备工作(参考上一篇) ); 接口的实现类AccountDaoImpl.java修改 /** * 账户的持久层实现类 */ @Repository(&quo ...

  2. Python自学day-1

    一.Python介绍 1.python擅长领域:     WEB开发:Django. pyramid. Tornado. Bottle. Flask. WebPy     网络编程:Twisted(牛 ...

  3. Angular2国际化

    使用angular-cli初始化项目: ng new my-project 使用npm安装ngx-translate模块 npm install --save @ngx-translate/core ...

  4. string类总结第二部分实战练习

    第二部门:实战练习 昨天由于时间原因,这个部分应该在同一个文章中的,无奈只能今天再开一个了,今天主要是讲一些面试题 一:equals和==的区别 最简单的面试题,也是最基础的,我估计每个学习java的 ...

  5. MAC 安装telnet

    https://blog.csdn.net/licheng70356213/article/details/81162660 在10.12及以下版本,都内置了telnet命令,但是在10.13中,已经 ...

  6. centos7 中安装 htop

    首先启用 EPEL Repository: yum install -y epel-release 启用 EPEL Repository 后, 可以用 yum 直接安裝 Htop: yum insta ...

  7. C++学习笔记 之 运算符

    用来执行特定的数字或逻辑操作,C++主要提供的运算符如下: 算数运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算数运算符: 主要运算符:+(加).-(减) .*(乘) ./(除) ...

  8. java集合框架中的去重问题

    对于自定义的类来说,必须要重写hashcode和equals方法 hashcode方法的作用是确定元素在数据结构中的位置,当两个元素的hash值一样时,需要用equals方法判断两个元素是否是一样的, ...

  9. HDU 2298:Toxophily(推公式)

    http://acm.hdu.edu.cn/showproblem.php?pid=2298 题意:给出一个x,y,v,问从(0,0)以v为初速度射箭,能否射到(x,y)这个点,如果能,输出最小的射出 ...

  10. Codeforces Gym101205D:Fibonacci Words(KMP+递推)

    Gym 101205D 题意:f[0] = "0", f[1] = "1",接下来f[i] = f[i-1] + f[i-2],相当于字符串拼接.然后给出一个n ...