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. 中转Webshell 绕过安全狗(一)

    前言 听说中国菜刀里有后门.抓包我是没有监测到异常数据包.为了以防万一,且更好使用中国菜刀硬杠安全狗.笔者收集了一下资料.无耻的copy大佬的源码,只是在大佬的基础上简单修改了一下,达到Webshel ...

  2. 【数据结构】红黑树-Java实现

    WIKI:https://en.wikipedia.org/wiki/Red%E2%80%93black_tree 转:红黑树(五)之 Java的实现 总结的比较精炼的: http://www.cnb ...

  3. vscode左边侧边栏字体的大小

    相信很多小伙伴们都会在用vscode的时候,当屏幕大小发生变化的时候,你可能会觉得左边的字体太小了,我也遇到了这样的问题,百度也没有找到解决办法,自己摸索了几天,发现可以通过ctrl+shift+ + ...

  4. PATB 1004 成绩排名 (20)

    1004. 成绩排名 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 读入n名学生的姓名.学号.成绩,分 ...

  5. 记2017青岛ICPC

    2017青岛ICPC 11月4日 早上很早到达了青岛,然后去报道,走了好久的校园,穿的很少冷得瑟瑟发抖.中午教练请吃大餐,吃完饭就去热身赛了. 开幕式的时候,教练作为教练代表讲话,感觉周围的队伍看过来 ...

  6. c++学习书籍推荐《深入理解C++11 C++11新特性解析与应用》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <深入理解C++11:C++11新特性解析与应用>编辑推荐:C++标准委员会成员和IBM XL编译器中国开发团队共同撰写,权威性毋庸置疑.系统.深 ...

  7. c++学习书籍推荐《C++语言的设计与演化》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++语言的设计与演化>由C++语言的设计者Bjarne Stroustrup著就,是一本阐述C++语言的设计及开发过程的无可争辩的内情手册.S ...

  8. html解析器:Html Agility Pack

    去掉注释.样式.和js代码: foreach(var script in doc.DocumentNode.Descendants("script").ToArray()) scr ...

  9. Windows下通过CMD命令行程序操作MySQL数据库

    注意:如果您的MySQL没有安装在C盘下,先使用命令进入MySQL的安装目录下的bin目录中才可以进行后续操作. 方法如下:例如您安装在D盘.先输入 D:  回车即可进入D盘,再输入cd D:\您my ...

  10. 学习springboot整合mybatis并编写测试类

    报名立减200元.暑假直降6888. 邀请链接:http://www.jnshu.com/login/1/20535344 邀请码:20535344 遇到的问题: 1.原因是在启动类上只有一个@Map ...