【译】利用Lombok消除重复代码
当你在写Getter和Setter时,一定无数次的想过,为什么会有POJO这么烂的东西。你不是一个人!(不是骂人…)无数的开发人员花费了大量的时间来写这种样板代码,而他们本来可以利用这些时间做出更有价值的输出。
从我开始写Java以来,已经写了几千行代码了,其中大概50%都是样板代码,在转型之前,我就这么一直毫无怨言的写着。而最近两年,我不再Java了,转而开始写一些Python,Go和JavaScript的代码。这时我才感觉到Java中的重复的样板代码是多么令人沮丧。
值得庆幸的是,现在的IDE为我们提供了自动生成这些代码的功能。但是我仍然需要按快捷键或者点鼠标来操作,这是非常影响我的编码思路的。
Lombok简介
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again
上面这段话摘自Lombok的首页。这是一个每个人都需要使用的库,简直是一种仙丹!开个玩笑。Java是一门很棒的语言,但是它的冗长经常会令人感到苦恼。
Lombok到底有多香呢?我总结了以下几点:
- Getter和Setter注解会自动生成getter、setter方法
- NoArgsConstructor和AllArgConstructor可以帮助你快速生成构造函数
- ToString会使POJO打印更加友好的日志
- Data会让你的POJO成为一个完全符合规范的POJO
- SneakyThrows可以偷偷抛出检查异常,而不需要再写throws子句
想了解更多Lombok特性的话,可以自行前往https://projectlombok.org/features/all查看。
Lombok是如何工作的?
Lombok是在Java注解处理器和几个编译时注解的帮助下工作的,它将注入额外的Java字节码来帮助我们处理重复的代码。你可以查看它生成的Java代码,这一过程被幽默的称为“Delombokisation”。
我应该如何开始使用?
Lombok引入了一个额外的编译时依赖。
如果你使用vanilla javac进行编译,你需要指定lombok.jar作为注解处理器:javac -cp lombok.jar MyCode.java
如果你使用的是maven,那么需要在pom.xml中插入以下代码来保证你的代码可以使用Lombok。
<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.4</version><scope>provided</scope></dependency>
</dependencies>
如果你使用的是Gradle,那么你需要使用Gradle Lombok插件
plugins {id 'io.franzbecker.gradle-lombok' version '1.14'id 'java'
}
设置你的IDE
从你开始使用Java起,你应该就开始使用一个智能的IDE来自动编译或给你的代码提供一些建议。为了将Lombok集成进IDE,你需要告诉Lombok io来安装合适的钩子。
获取Lombok的jar包后,执行java -jar lombok.jar
来完成所有的设置。
IntelliJ IDEA和Visual Studio用户需要一个单独的Lombok插件,你可以选择从插件库中安装。
代码拿来!
talk is cheap, show me your code.程序员就应该拿代码说话。下面我们就来看一个完整的例子。
Getters和Setters
为被注解的自动生成getXXX和setXXX方法。
import lombok.Getter;
import lombok.Setter;class UptimeResponse {// GetXXX and SetXXX are automatically generated@Getter @Setter private long uptime;@Getter @Setter private long currentTime;@Getter @Setter private String status;UptimeResponse() {this.uptime = ManagementFactory.getRuntimeMXBean().getUptime();this.currentTime = System.currentTimeMillis();this.status = "OK";}
}
// So this works automagically
UptimeResponse res = new UptimeResponse();
res.setStatus("FAIL");
System.out.println(res.getUptime());
Constructors
可以自动创建默认的POJO构造函数,它将字段初始化为默认值。
- NoArgConstructor创建一个无参构造函数,所有的字段都会初始化为默认值
- AllArgsConstructor创建一个全参数构造函数,每个字段都会初始化为指定值
- RequiredArgsConstructor创建一个构造函数,参数包括所有final字段和标记为NotNull的字段
import lombok.*@AllArgsConstructor
class Document {@Getter @Setter private String title;@Getter @Setter private String content;// ...
}
// This works automagically
Document d = new Document("Hello World", "Message Body");
d.getTitle(); // Hello World
d.getContent(); // Message Body
Equals and hash codes
Lombok可以生成的样板代码是包含局部变量的equals方法和hashcode方法。你可以手动排除一些字段。
import lombok.*;@RequiredArgsConstructor
@EqualsAndHashCode
class User {@Getterprivate final String username;@EqualsAndHashCode.Exclude@Getter@Setterprivate String lastAction; // not required for equality checks
}
// This works automagically
User u1 = new User("amitosh");
u1.setLastAction("Hello");
User u2 = new User("amitosh");
u2.setLastAction("Compile");
u1.equals(u2) // Gives true
To String
Lombok的ToString注解自动生成toString方法,其中包含类封装的全部字段。这是用于生成调试表示的快速方法。
import lombok.ToString;
import lombok.Getter;
import lombok.Setter;@ToString
class Entry {@Getter @Setter private String id;@Getter @Setter private String target;
}
// This works automagically
Entry e = new Entry();
// ...
System.out.println(e); // Nice output with values of id and target
Data classes
这个注解用于生成符合规范的完整POJO。它是ToString、EqualsAndHashCode以及所有非final字段的Getter和Setter的集合体。
import lombok.Data;@Data
class Message {private String sender;private String content;
}
// This works automagically
Message m = new Message("amitosh", "Hello World");
m.setSender("agathver");
m.getContent(); // Hello World
m.toString(); // ...
SneakyThrows
Java是一门静态检查语言,但有时检查会比较多余。例如有时我们不关心异常,或者确定代码中不会出现异常,所以就不想去写捕获和处理异常的代码。这时SneakyThrows注解可以帮助我们一起骗过编译器。
但要注意不能滥用这个注解。
import lombok.SneakyThrows;public class SneakyThrowsExample {@SneakyThrows(UnsupportedEncodingException.class)public String utf8ToString(byte[] bytes) {// This exception is never generated as UTF-8 is guaranteed// to be supported by the JVMreturn new String(bytes, "UTF-8");}
}
Delomboking
不是所有的工具都支持Lombok的,最著名的是JavaDoc工具。你需要有一个中间态的代码来使文档正确表示。此外,有时候你可能会想看看Lombok生成的代码到底是什么样的。幸好Lombok提供了“delomboking”,用来将Lombok转换成Java源代码。
要转换一个文件夹下的全部代码,可以使用以下命令:
java -jar lombok.jar delombok src -d src-delomboked
maven和gradle插件也包含了delomboking任务,在你需要的时候可以使用。
Lombok是一个提高你的Java生产力的工具。我无法想象没有它时应该怎么写Java程序。真心希望你在读完本文以后能够认识到它的强大!
原文地址
https://medium.com/@agathver/banish-repetitive-java-code-with-lombok-f9b97d0d4137
译者点评
Lombok是一款非常好用的工具,它可以帮助我们快速构建POJO类。但是如果直接使用@Data注解时,会破坏类的封装特性。这点不符合面向对象编程的思想,但工作中会使用一些序列化工具,这些工具要求所有字段都要有setter方法。为了编码的方便,可能使用@Data方法是一个好的选择。
【译】利用Lombok消除重复代码相关推荐
- 无码系列5.1 代码重构 消除重复代码
1 前言 本文可以视为对ThoughtWorks高级顾问yuanyingjie关于"正交四原则"策略"消除重复"的"个人解读". 如有谬误, ...
- java冗余_Java使用lombok消除冗余代码的方法步骤
一.项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法. lombok项目的产生就是为了 ...
- 利用注解 + 反射消除重复代码(Java项目)
作者 | Leilei Chen 来源 | https://llchen60.com/ 1. 案例场景 假设银行提供了一些 API 接口,对参数的序列化有点特殊,不使用 JSON,而是需要我们把参数依 ...
- 利用注解 + 反射消除重复代码,妙!
1.1 案例场景 假设银行提供了一些 API 接口,对参数的序列化有点特殊,不使用 JSON,而是需要我们把参数依次拼在一起构成一个大字符串: 1)按照银行提供的API文档顺序,将所有的参数构成定长的 ...
- java 重复代码优化_利用注解 + 反射消除重复代码(Java项目)
1. 案例分析 1.1 案例场景 假设银行提供了一些 API 接口,对参数的序列化有点特殊,不使用 JSON,而是需要我们把参数依次拼在一起构成一个大字符串 按照银行提供的API文档顺序,将所有的参数 ...
- 重构 - 提炼函数,消除重复代码
一.参考资料 二.重构步骤 - 以提炼重复计算函数为例子 演示代码 具体步骤 1.提取重复new创建 2.提取会变化的信息 3.使用抽取的共有信息,并删除原有信息 4.提取计算函数 5.使用卫语句,简 ...
- java开发之消除冗余代码的3种方法
一.利用工厂模式+模板方法模式 我们以做蛋糕为例来演示如何消除重复代码. 假设我们要做3种不同口味的蛋糕,分别是抹茶,可可和草莓蛋糕,实际上3种蛋糕的制作方法是极其相似的,只有添加的粉剂不 同,如果用 ...
- 从阿里跳槽来的工程师,分享了三套干掉 “重复代码”方式,真的太绝了!
附:糖豆广场舞永久会员TV版 软件工程师和码农最大的区别就是平时写代码时习惯问题,码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码. 业务同学抱怨业务开发没有技术含量,用不到设计模 ...
- 芋道 Spring Boot 消除冗余代码 Lombok 入门
点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 ...
最新文章
- python3最好的书籍推荐-推荐几本Python3相关书籍?最好分一下基础、进阶、高级...
- 【设计模式系列】OO设计原则之LSP-Liskov替换原则
- [福大软工] W班 总成绩排行榜
- TeX下的Markdown包
- boost::fusion::flatten用法的测试程序
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛B: Out-out-control cars
- linux并发服务器实例,linux-----网络编程----epoll实现并发服务器
- 斐波那契数列c++代码_轮到你了,斐波那契数列!
- java 示例_功能Java示例 第5部分–将I / O移到外部
- 【数据结构与算法】【算法思想】【算法总结】索引结构
- excel超级工具箱_这6个Excel高效办公插件,你都用过吗?
- 《大数据》杂志——大数据技术发展的十个前沿方向(中)
- java实例变量,局部变量,类变量和final变量
- Python+OpenCV:色彩空间转换
- UVA515 King
- 按键精灵调用python文件_Python按键精灵自动化
- python匹配邮箱_在Python中使用正则表达式同时匹配邮箱和电话并进行简单的分类...
- SQL语句----CASE WHEN 的用法简介
- 五线谱编辑Demo(MFC)
- 如何带好一个团队?团队管理的要点有哪些?