终极CRUD-2-用lombok提高开发效率
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
出处:https://www.cnblogs.com/AdaiCoffee/
本文以学习、研究和分享为主,欢迎转载。如果文中有不妥或者错误的地方还望指出,以免误人子弟。如果你有更好的想法和意见,可以留言讨论,谢谢!
终极CRUD-2-用lombok提高开发效率的更多相关文章
- Spring Boot2 系列教程 (三) | 使用 LomBok 提高开发效率
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 上周去了开年会,去的地方是温泉度假村.老实说,我是无感的,90% 是因为没中奖(老板太抠,两百人只抽三个奖),10 ...
- 基于SpringBoot从零构建博客网站 - 整合lombok和mybatis-plus提高开发效率
在上一章节中<技术选型和整合开发环境>,确定了开发的技术,但是如果直接这样用的话,可能开发效率会不高,为了提高开发的效率,这里再整合lombok和mybatis-plus两个组件. 1.l ...
- 【IDEA】(3)---非常实用提高开发效率和水平的插件
IDEA(3)-Mac中IDEA插件 IDEA提供了许多很实用的插件,能够大大提高开发效率和开发水平,这里列举几个很实用的插件. 说明:这边的IDEA是MAC系统. 一.插件管理界面简介 1.界面位置 ...
- IDEA提高开发效率的7个插件
IDEA提高开发效率的7个插件 1. 多行编辑 先来体验一下从xml文件拷贝字段新建实体对象 一般我们为了新建多表连接后映射的 ResultMap ,耗费不少时间,那么我们就来试一试这个多行编辑 表字 ...
- 如何利用 Visual Studio 自带工具提高开发效率
Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...
- 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式
在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...
- 善用VS中的Code Snippet来提高开发效率
http://www.cnblogs.com/anderslly/archive/2009/02/16/vs2008-code-snippets.html http://www.cnblogs.com ...
- 实用手册:130+ 提高开发效率的 vim 常用命令
Vim 是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器.这里收录了130+程 ...
- 提高开发效率的 Eclipse 实用操作
工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...
- 10 款提高开发效率的 jQuery/CSS3 组件
前端开发是一项十分繁琐而又耗体力的工作,如何更有效率的开发我们的应用,很多人会选择适当地使用一些jQuery插件.今天就要给大家分享10款可以提高开发效率的jQuery/CSS3组件.部分插件可以下载 ...
随机推荐
- 中转Webshell 绕过安全狗(一)
前言 听说中国菜刀里有后门.抓包我是没有监测到异常数据包.为了以防万一,且更好使用中国菜刀硬杠安全狗.笔者收集了一下资料.无耻的copy大佬的源码,只是在大佬的基础上简单修改了一下,达到Webshel ...
- 【数据结构】红黑树-Java实现
WIKI:https://en.wikipedia.org/wiki/Red%E2%80%93black_tree 转:红黑树(五)之 Java的实现 总结的比较精炼的: http://www.cnb ...
- vscode左边侧边栏字体的大小
相信很多小伙伴们都会在用vscode的时候,当屏幕大小发生变化的时候,你可能会觉得左边的字体太小了,我也遇到了这样的问题,百度也没有找到解决办法,自己摸索了几天,发现可以通过ctrl+shift+ + ...
- PATB 1004 成绩排名 (20)
1004. 成绩排名 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 读入n名学生的姓名.学号.成绩,分 ...
- 记2017青岛ICPC
2017青岛ICPC 11月4日 早上很早到达了青岛,然后去报道,走了好久的校园,穿的很少冷得瑟瑟发抖.中午教练请吃大餐,吃完饭就去热身赛了. 开幕式的时候,教练作为教练代表讲话,感觉周围的队伍看过来 ...
- c++学习书籍推荐《深入理解C++11 C++11新特性解析与应用》下载
百度云及其他网盘下载地址:点我 编辑推荐 <深入理解C++11:C++11新特性解析与应用>编辑推荐:C++标准委员会成员和IBM XL编译器中国开发团队共同撰写,权威性毋庸置疑.系统.深 ...
- c++学习书籍推荐《C++语言的设计与演化》下载
百度云及其他网盘下载地址:点我 编辑推荐 <C++语言的设计与演化>由C++语言的设计者Bjarne Stroustrup著就,是一本阐述C++语言的设计及开发过程的无可争辩的内情手册.S ...
- html解析器:Html Agility Pack
去掉注释.样式.和js代码: foreach(var script in doc.DocumentNode.Descendants("script").ToArray()) scr ...
- Windows下通过CMD命令行程序操作MySQL数据库
注意:如果您的MySQL没有安装在C盘下,先使用命令进入MySQL的安装目录下的bin目录中才可以进行后续操作. 方法如下:例如您安装在D盘.先输入 D: 回车即可进入D盘,再输入cd D:\您my ...
- 学习springboot整合mybatis并编写测试类
报名立减200元.暑假直降6888. 邀请链接:http://www.jnshu.com/login/1/20535344 邀请码:20535344 遇到的问题: 1.原因是在启动类上只有一个@Map ...