Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【译】利用Lombok消除重复代码

【译】利用Lombok消除重复代码

作者头像
Jackeyzhe
发布于 2020-03-11 05:05:45
发布于 2020-03-11 05:05:45
1.1K00
代码可运行
举报
文章被收录于专栏:代码洁癖患者代码洁癖患者
运行总次数:0
代码可运行

当你在写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到底有多香呢?我总结了以下几点:

  1. Getter和Setter注解会自动生成getter、setter方法
  2. NoArgsConstructor和AllArgConstructor可以帮助你快速生成构造函数
  3. ToString会使POJO打印更加友好的日志
  4. Data会让你的POJO成为一个完全符合规范的POJO
  5. 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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.4</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

如果你使用的是Gradle,那么你需要使用Gradle Lombok插件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 IDEAVisual Studio用户需要一个单独的Lombok插件,你可以选择从插件库中安装。

代码拿来!

talk is cheap, show me your code.程序员就应该拿代码说话。下面我们就来看一个完整的例子。

Getters和Setters

为被注解的自动生成getXXX和setXXX方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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构造函数,它将字段初始化为默认值。

  1. NoArgConstructor创建一个无参构造函数,所有的字段都会初始化为默认值
  2. AllArgsConstructor创建一个全参数构造函数,每个字段都会初始化为指定值
  3. RequiredArgsConstructor创建一个构造函数,参数包括所有final字段和标记为NotNull的字段
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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方法。你可以手动排除一些字段。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import lombok.*;

@RequiredArgsConstructor
@EqualsAndHashCode
class User {
    @Getter
    private final String username;
    @EqualsAndHashCode.Exclude
    @Getter
    @Setter
    private 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方法,其中包含类封装的全部字段。这是用于生成调试表示的快速方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的集合体。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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注解可以帮助我们一起骗过编译器

但要注意不能滥用这个注解。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 JVM
       return new String(bytes, "UTF-8");
   }
}

Delomboking

不是所有的工具都支持Lombok的,最著名的是JavaDoc工具。你需要有一个中间态的代码来使文档正确表示。此外,有时候你可能会想看看Lombok生成的代码到底是什么样的。幸好Lombok提供了“delomboking”,用来将Lombok转换成Java源代码。

要转换一个文件夹下的全部代码,可以使用以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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方法是一个好的选择。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码洁癖患者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
利用matlab实现非线性拟合(上)
一般而言,通过已有的数据点去推导其它数据点,常见的方法有插值和拟合。插值适用性较广,尤其是线性插值或样条插值已被广泛的应用。但是通过已知的函数去拟合数据,是连接理论与实验重要的桥梁,这一点是插值无法替代的。
巴山学长
2021/04/22
2.5K0
利用matlab实现非线性拟合(上)
利用matlab实现非线性拟合(补)
之前在群里看有人问过三维拟合的问题。回去思考了一下,感觉和之前的非线性拟合还是有很多共同之处的。所以,这次将之前PSO方法的非线性拟合代码改动了一下,将其更改为适用性更广的高维拟合。
巴山学长
2021/05/08
1.6K0
利用matlab实现非线性拟合(补)
Matlab中的画图函数
之前在进行Matlab编程时,画图总是非常重要的一部分,在这里整理一下常用的绘图函数,以作备用。
全栈程序员站长
2022/11/06
3.4K0
Matlab中的画图函数
从泰勒级数说傅里叶级数
泰勒中值定理:若函数f(x)在含有x0的某个开区间内具有直到(n+1)阶的导数,那么对于任一x∈(a,b),有:
巴山学长
2020/06/17
2.8K0
非线性可视化(2)非线性相图
这里举的例子都是自治系统方程的例子,也就是方程结果与t0的初始取值无关(时不变系统),不含外部周期性驱动力之类的与t相关的量。因为描述自治系统,只需要知道系统的空间上的各个变量的导数,然后组成相空间即可。而时变系统各个状态都会随时间变化,无法用静态的相图去定性分析。
巴山学长
2023/03/15
8930
非线性可视化(2)非线性相图
matlab二维彩图colormap调色_matlab如何自定义颜色
这个博客是自己的第一篇博客,瞎写实验中。。。 (2020年2月第一次更新,调整了一下格式,增加了常用的颜色图形式)
全栈程序员站长
2022/11/07
5.5K1
matlab二维彩图colormap调色_matlab如何自定义颜色
MATLAB非线性可视化之线性系统相图
我们在前面的多摆模型中,利用多摆的微分方程模型,求解出了多摆每时每刻的位置随时间的变化。当然那是一个高度复杂的非线性模型,难以上手分析。
巴山学长
2021/09/18
1.9K0
MATLAB非线性可视化之线性系统相图
Matlab机器人工具箱
因为需要用到和机器人相关的东西,就用到了这个工具箱,作者官网 http://www.petercorke.com/Robotics_Toolbox.html
全栈程序员站长
2022/08/13
7750
Matlab机器人工具箱
带你用matlab轻松搞定微分方程
之前过冷水有和大家分享热传导方程求解的方法,其本质上是微分方程的问题。考虑大多数读者对微分方程求解方法比较陌生,所以过冷水本期简单普及一下微分方程的求解问题。
巴山学长
2020/11/03
1.6K0
带你用matlab轻松搞定微分方程
【MATLAB 从零到进阶】day6 MATLAB绘图与可视化
图形窗口、线条、曲面和注释等都被看作是MATLAB中的图形对象,所有这些图形对象都可以通过一个被称为“句柄值”的东西加以控制,例如可以通过一个线条的句柄值来修改线条的颜色、宽度和线型等属性。这里所谓的“句柄值”其实就是一个数值,每个图形对象都对应一个唯一的句柄值,它就像一个指针,与图形对象一一对应。例如可以通过命令h = figure返回一个图形窗口的句柄值。
统计学家
2019/04/10
7690
【MATLAB 从零到进阶】day6 MATLAB绘图与可视化
MATLAB非线性可视化(引3)多摆模型
事实上,非线性存在于物理与工程中的各个领域。在机械中,就存在着大量的非线性现象。通过双摆和三摆的例子,来感受到一个小的扰动,随着时间的推移,到最终会带来多大的变化。
巴山学长
2023/03/15
6530
MATLAB非线性可视化(引3)多摆模型
曲线折叠
曲线折叠 clear ; close all; %正常绘图 x=0:0.005:5; y=exp(-6*x).*sin(x*40)*6+exp(5*x)*5e-11.*sin(x*20); figur
万木逢春
2019/04/30
1.7K0
曲线折叠
谐振子的动力学学运动
在力学的学习过程中经典分析力学是最基本的入门知识,过冷水之前和大家一起学习了两个小车通过弹簧链接起来的做来回摆动运动的运动轨迹学习。推文中直接给了一个微分方程组,然后解出微分方程组就得到了小车的演化轨迹。本期过冷水从零开始构建一个微分方程组,而不是单纯解微分方程。
巴山学长
2021/05/31
6540
谐振子的动力学学运动
Matlab线性插值
figure yi_nearest=interp1(t,p,x,'nearest');%最邻近插值法 plot(t,p,'ko'); hold on plot(x,yi_nearest,'g','LineWidth',1.5);grid on; title('Nearest Method');
AIHGF
2019/02/18
2.5K0
Matlab线性插值
统计回归拟合方程参数
一直以来过冷水都有给大家分享图像拟合的知识、从泰勒级数说傅里叶级数、Matlab多项式拟合初探,本期过冷水给大家讲讲统计回归做拟合。
巴山学长
2020/09/29
4540
统计回归拟合方程参数
matlab画折线图
p=‘plot_scale.xlsx’; a=xlsread§; x=a(1,:);%x轴上的数据,第一个值代表数据开始,第二个值代表间隔,第三个值代表终止 susan=a(2,:);%a数据y值 HarrisLaplace=a(3,:); MSCP=a(4,:); CPDA=a(5,:); HeYung=a(6,:); FastCPDA=a(7,:); DOG=a(8,:); GCM=a(9,:); ANDD=a(10,:); MSRJ=a(11,:); ZhangSun=a(12,:); WEAE=a(13,:); New_Curvature=a(14,:); ASJ=a(15,:); Superpoint=a(16,:); SOGGDD=a(17,:); % figure(1);
全栈程序员站长
2022/07/01
6240
Matlab学习
此 MATLAB 函数 清除命令行窗口中的所有文本,让屏幕变得干净。运行 clc
裴来凡
2022/05/29
1.4K0
Matlab学习
matlab绘图(五)
过冷水有段时间没有和大家分享MATLAB的编程知识了,皆因懒。本期给大家分享一点关于绘图的小技巧,经常有朋友让我帮忙绘图,感觉在我这里是小事,在他们那就是很特别的技能,有时候朋友的特殊绘制要求,也让我犯难。现将自己平时的绘图经验做个小结,主要是关于matlab绘图的一些注意点——公式输入、多轴绘图、交点标记、箭头绘制,通过实际案例给大家讲讲具体的使用。
巴山学长
2020/02/17
1.2K0
matlab绘图(五)
Matlab画图常用的线条符号、颜色
4 、若要同时改变颜色及图线型态(Line style),也是在坐标对后面加上相关字串即可
全栈程序员站长
2022/07/01
2.8K0
matplotlib
r表示不需要转义,raw(生的),LATEX用法,python中使用latex,需要在文本的后面加上$,\pi会转义为pi
h3110_w0r1d
2024/02/19
1540
matplotlib
相关推荐
利用matlab实现非线性拟合(上)
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验