当你在写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。

<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构造函数,它将字段初始化为默认值。

  1. NoArgConstructor创建一个无参构造函数,所有的字段都会初始化为默认值
  2. AllArgsConstructor创建一个全参数构造函数,每个字段都会初始化为指定值
  3. 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 {
@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方法,其中包含类封装的全部字段。这是用于生成调试表示的快速方法。

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 JVM
return 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消除重复代码的更多相关文章

  1. 使用#include消除重复代码

    消除重复代码代码很多种,比如: 1)提炼成函数复用 2)使用宏 3)继承 4)使用闭包(boost::bind.boost::function) 上述是最为常用的,对于C++程序,闭包可能用得相对少一 ...

  2. 2.C#中通过委托Func消除重复代码

    阅读目录   一:重复的代码 二:C#中通过委托Func消除重复代码 一:重复代码    public class Persion { public string Name { get; set; } ...

  3. 1.C#中通过委托Action消除重复代码

    阅读目录 一:重复的代码  二:使用委托消除重复代码     一:重复的代码    我们在写一些方法的时候,会在里面可能出现异常的地方使用try catch语句,这样每个方法都会有try catch语 ...

  4. Metalama简介2.利用Aspect在编译时进行消除重复代码

    上文介绍到Aspect是Metalama的核心概念,它本质上是一个编译时的AOP切片.下面我们就来系统说明一下Metalama中的Aspect. Metalama简介1. 不止是一个.NET跨平台的编 ...

  5. 利用设计模式消除业务代码中的 if-else

    准备工作:假设这样的一个业务场景:有一个自动开票的功能需要实现,在程序里面需要根据账单的类型执行对应的处理逻辑. 以下使用了 Lombok 简化代码!!! 账单类型枚举: /** * @author ...

  6. Android 勤用RXJava compose操作符消除重复代码

    相信小伙伴在使用RXJava与Retrofit请求网络时,都有遇到过这样的场景,在IO线程请求网络解析数据,接着返回主线程setData.更新View试图,那么也肯定熟悉下面这几句代码: .subsc ...

  7. 代码的坏味道(14)——重复代码(Duplicate Code)

    坏味道--重复代码(Duplicate Code) 重复代码堪称为代码坏味道之首.消除重复代码总是有利无害的. 特征 两个代码片段看上去几乎一样. 问题原因 重复代码通常发生在多个程序员同时在同一程序 ...

  8. 使用枚举类Enum作为callee和caller的约定,运用反射消除分支和重复代码在命令式程序中的应用

    在开发过程中,程序提供的功能由简单变得复杂,承担功能的主要类也会因此变得庞大臃肿,如果不加以维护,就会散发出浓重的代码味道.下面这篇博文,主要讲述了利用Enum,反射等手段简化重构代码的过程. 代码涉 ...

  9. Spring Boot中使用Lombok消除POJO类模板代码

    首先,要让IDE支持Lombok,这里以idea为例进行介绍. 点击项目的“File”-—>"settings"—>"Plugins",在marke ...

随机推荐

  1. php反序列化漏洞复现

    超适合小白的php反序列化漏洞复现 写在前头的话 在OWASP TOP10中,反序列化已经榜上有名,但是究竟什么是反序列化,我觉得应该进下心来好好思考下.我觉得学习的时候,所有的问题都应该问3个问题: ...

  2. python 之 pygame

    学习pygame如果不了解pygame是什么的可以产考百度或者去官网去看介绍pygame急忙趁着三分的热度,整理一下关于pygame的相关内容,顺便复习一下Markdown编辑器 pygame的介绍 ...

  3. Mysql高手系列 - 第26篇:聊聊如何使用mysql实现分布式锁

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第26篇. 本篇我们使用my ...

  4. 详解 Redis 内存管理机制和实现

    Redis是一个基于内存的键值数据库,其内存管理是非常重要的.本文内存管理的内容包括:过期键的懒性删除和过期删除以及内存溢出控制策略. 最大内存限制 Redis使用 maxmemory 参数限制最大可 ...

  5. TwoHandleSlider/RangeSlider

    项目需求:双滑块slider,可以实现选择一个范围 (一)添加两个slider,并把背景以及fill设置为透明,并去除RaycastTarget (二)在背景下添加个一个image,背景图为滑块划过后 ...

  6. (二)Kinect关节识别

    基础:添加KinectManager 组件 1)局部关节获取(参考插件场景KinectOverlayDemo1) 要获取局部某一关节及其位置,添加脚本JointOverlayer即可,通过Tracke ...

  7. vue cli3.3 以上版本配置vue.config.js

    // vue.config.js 配置说明//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions// 这里只 ...

  8. pyarango整理

    目录: 连接数据库 创建数据库/集合/文档 检索筛选 更新 删除 调用AQL的方法 安装需要用到的python包: pip install pyarango 一.连接数据库: >>> ...

  9. C语言I—2019秋作业01

    1您对软件工程专业或计算机科学与技术专业了解是什么? 工程专业将成为一个新的热门专业.软件工程专业以计算机科学与技术学科为基础,突出软件开发的工程性,使学生在掌握计算机科学与技术方面知识和技能的基础上 ...

  10. 记一次C#调用C++踩过的坑

    一般来说,C#调用C++生产的dll,如下: C++的项目要设置为"导出dll的项目",而且导出的函数,一般为: extern "C" __declspec(d ...