让人又爱又恨的Lombok,到底该不该用
1 简介
Lombok
,印尼的一个岛屿,龙目岛。但在Java的世界里,它是一个方便的类库,能提供很多便利,因此得到许多人的青睐。但也有不少反对声音。这是为什么呢?
之前去龙目岛
拍的日落。
2 Lombok提供的便利
一般我们在Java中用到POJO
时,就很容易想到要用Lombok
,如VO
、DTO
、DO
等。使用Lombok
需要安装对应IDE的插件,同时需要引入依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
举个例子,如果不用Lombok
,实现getter/setter
、equals
、hashCode
、toString
代码量非常大,如下所示:
package com.pkslow.basic.lombok;
import java.util.Objects;
public class Book {
private String name;
private int id;
private double price;
private String author;
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return id == book.id &&
Double.compare(book.price, price) == 0 &&
Objects.equals(name, book.name) &&
Objects.equals(author, book.author) &&
Objects.equals(desc, book.desc);
}
@Override
public int hashCode() {
return Objects.hash(name, id, price, author, desc);
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", id=" + id +
", price=" + price +
", author='" + author + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
而且大部分是样板代码,没有太多实际逻辑。
如果使用Lombok
则非常简单,一个注解@Data
就可以完成以上工作(安装了Lombok插件后才能显示右边的方法):
Lombok
的常用注解有:
@NonNull
:用于做空指针异常检测;
@Cleanup
:自动资源关闭;
@Getter/@Setter
:自动生成get/set
方法;
@ToString
:生成toString
方法,方便打印调试;
@EqualsAndHashCode
:生成equals
和hashCode
方法,注意这两个应该同时去实现;
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
:构造方法;
@Data
:相当于 @ToString
+ @EqualsAndHashCode
+@Getter
+ @Setter
+@RequiredArgsConstructor
。
@Builder
:生成builder方法;
@Log
:日志相关:
@CommonsLog:org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@Flogger:com.google.common.flogger.FluentLogger.forEnclosingClass();
@JBossLog:org.jboss.logging.Logger.getLogger(LogExample.class);
@Log:java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j:org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2:org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j:org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j:org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
@CustomLog:com.foo.your.LoggerFactory.createYourLogger(LogExample.class);
所以Lombok
确实能给我们带来极大的便利,减少大量重复、无业务逻辑的代码,代码显得比较干净;修改了field的名字,不用多处修改;提高开发效率。
3 Lombok所带来的问题
当然,也有人提出了不同意见:
调试时没有具体代码,不方便Debug;
需要强制别人安装第三方插件,不然会显示报错;
在检查测试覆盖率的时候,无法直观显示哪些代码已覆盖和未覆盖;
无法按自己意愿实现,比如toString
方法,有时需要输出不一样的String
格式,并不一定是按Lombok
的实现;
对于一些常用的方法,IDE已经可以自动生成,不需要Lombok
一样可以高效开发。
IDEA没有提供Builder
,但可以通过安装插件方式使用。
成功安装后,就能生成Builder代码了:
4 总结
一开始我是支持使用Lombok
的,经过一段时间使用及出现了一些问题后,我还是觉得通过IDE自动生成代码的方式更适合。毕竟强制要求别人安装插件这种实在是太野蛮了,而通过IDEA生成代码,别人不安装插件也不会有报错。
另外,多几行代码还能体现工作量,哈哈哈哈哈哈......
欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
多读书,多分享;多写作,多整理。
让人又爱又恨的Lombok,到底该不该用的更多相关文章
- 谈谈Nancy中让人又爱又恨的Diagnostics【上篇】
前言 在Nancy中有个十分不错的功能-Diagnostics,可以说这个功能让人又爱又恨. 或许我们都做过下面这样的一些尝试: 记录某一个功能用到的相关技术信息 记录下网站的访问记录 全局配置某些框 ...
- Lambda-让人又爱又恨的“->"
写在前边 聊到Java8新特性,我们第一反应想到的肯定是Lambda表达式和函数式接口的出现.要说ta到底有没有在一定程度上"优化"了代码的简洁性呢?抑或是ta在一定程度上给程序员 ...
- 让人又爱又恨的char(字符型)
今天来总结一下char型,平常写算法的时候对这个东西感觉都有一点绕着走,说到底还是对这部分的知识不熟悉所以有点怕他,不过以后不要怕,今天来总结一下 首先,说到字符型数据类型,char型,恩它是一种数据 ...
- 让人又爱又恨的this
this是个神奇的东西, 既可以帮助我们把模拟的类实例化. 又可以在事件绑定里准确指向触发元素. 还可以帮助我们在对象方法中操作对象的其他属性或方法. 甚至可以在使用apply.call.bing.f ...
- MySQL让人又爱又恨的多表查询
1. 前言 在SQL开发当中,多表联查是绝对绕不开的一种技能.同样的查询结果不同的写法其运行效率也是千差万别. 在实际开发当中,我见过(好像还写过~)不少又长又臭的查询SQL,数据量一上来查个十几分钟 ...
- 又爱又恨系列之枚举enum
其实枚举挺简单的,只不过以前没好好学,所以不知道这个东西,恩,现在梳理一下 整体而言,首先枚举是一个数据类型,这个数据类型和结构体有点像 可以分为三个层次 1.枚举数据类型定义 第一种:enum 枚举 ...
- 爱与恨的抉择:ASP.NET 5+EntityFramework 7
EF7 的纠缠 ASP.NET 5 的无助 忘不了你的好 一开始列出的这个博文大纲,让我想到了很久之前的一篇博文:恋爱虽易,相处不易:当EntityFramework爱上AutoMapper,只不过这 ...
- 搞不懂为什么开发人员爱iOS恨Android?
导读:很多网站发表文章大同小异.唯有这个不同点,给大家分享. Android和iOS的较量一直都是人们津津乐道的话题.两个平台各有各的优势所在,同时也都力图能在各个方面赶超对手.对于用户来说,青菜萝卜 ...
- 又爱又恨的BOOTSTRAP
搞本书,看了一天,确实,,UIKIT比它好用... 但,艺多不压身吧. 今天自己抄了个大概的,不用其它插件,,但那手风琴,真的找了很多,没有中意的... <!DOCTYPE html> & ...
随机推荐
- 【JVM】堆区域的一个详细了解并附带调优案例
话不多说,直接撸图: 1>Eden中通过可达性分析,存活下来的对象直接通过复制算法移动到From区域中,此时该对象的分代年龄加1: 2>当下一次虚拟机进行[Minor GC]时,会同时对[ ...
- Java——关键字instanceof
instanceof 判断一个对象是否为一个类的实例,是为true ,否为false class Animal{} class Cat extends Animal{} /**instanceof 判 ...
- spring设计模式之applicationContext.getBean("beanName")思想
1.背景 在实际开发中我们会经常遇到不同的业务类型对应不同的业务处理,而这个业务类型又是经常变动的; 比如说,我们在做支付业务的时候,可能刚开始需要实现支付宝支付和微信支付,那么代码逻辑可能如下 /* ...
- eatwhatApp开发实战(一)
开发背景: 当你想用抛硬币来决定事情的时候,那么硬币抛起的瞬间,你就有答案了.一样的,吃啥?eatwhat点开,按钮一点,你就可以知道你中午要吃啥. 话不多说,项目开发走起 ADT点开,New==&g ...
- [微信营销企划之路]001.环境搭建(XAMPP+WeiPHP)
引言 本系列适合0基础的人员,因为我们就是从0开始的,此系列记录我们步入微信营销企划并进行开发的一些经验分享,望与君共勉!作为刚刚踏入微信队伍中的新人的我们,如果有什么不对的地方,还望不吝赐教. 在开 ...
- ActiveMQ 反序列化漏洞(CVE-2015-5254)复现
1.运行漏洞环境 sudo docker-compose up -d 环境运行后,将监听61616和8161两个端口.其中61616是工作端口,消息在这个端口进行传递:8161是Web管理页面端口.访 ...
- Golang基础教程——map使用篇
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第7篇文章,我们来聊聊golang当中map的用法. map这个数据结构我们经常使用,存储的是key-value的键 ...
- Rocket - diplomacy - 模块结构信息
https://mp.weixin.qq.com/s/cTRxXwWNEeb4-XX_t4bRcg 讨论模块结构信息的来源及使用方式. 1. diplomacy diplom ...
- TCP / IP 精彩回顾-必看
TCP/IP 协议出现的原因是互联网世界各个主机作为一个个独立的个体,如何制定统一的规则让他们互相通信是达成万物互联的纽带.基于此,设定了 TCP/IP 协议来规范网络访问行为.TCP/IP 并不是一 ...
- Java并发编程 (八) J.U.C组件拓展
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.J.U.C-FutureTask-1 FutureTask组件,该组件是JUC中的.但该组件不是 A ...