文档章节

以简单的方式消除 Java 的冗长(Lombok)

qqli
 qqli
发布于 2012/12/27 22:38
字数 2462
阅读 212
收藏 1
点赞 0
评论 0

复制的红薯的,自己只是做一个归档,方便自己看。

------------------------------------------------------------------------------------

Lombok 是一种 Java Archive (JAR) 文件,可用来消除 Java 代码的冗长。

我们看这样一个例子,一个标准的 Java bean。一个典型的 Java bean 一般具有几个属性。每个属性具有一个 accessor 和 mutator(getter 和 setter)。通常还会有一个 toString() 方法、一个equals() 方法和一个 hashCode() 方法。

初看上去,其中可预见的冗余就已经非常多了。如果每个属性都具有一个 getter 和 setter,并且通常如此,那么又何必详细说明呢?

让我们来看看 Lombok。为了消除代码行,Lombok 使用注释来标识类和 Java 代码块。在前述的那个 Java bean 示例中,所有的 getter、setter 以及其他三个方法都是在编译时被暗示并包括进来的。

而且更好的是如果您使用的是 Eclipse 或 IBM® WebSphere® Studio Application Developer(如果还没用的话,建议最好使用),您就可以将 Lombok 集成到 Java 项目并即刻获得开发时结果。换言之,Eclipse 编译器可以立即识别所暗指的 getters/setters,而其他 Java 代码则可引用这些方法。

最直接的好处当然是代码行的减少,这真的很棒。并且,如果有一个特定的 getter 或 setter 需要特别的注意,那么您就不必为了找到这个特定的 getter 或 setter 而遍历数十行代码。代码也会更为简洁并且冗余也少了。

Lombok 还让您得以简化代码的其他部分 — 不仅仅是 Java bean。比如,还可以减少 try/catch/finally 块内以及同步方法内的冗余代码。

-----------------------------------绿字部分讲的是lombok的安装

现在,我们来看看在您自己的开发环境中如何能实现上述目的。

要进行安装,本文假设您使用的是 Eclipse 或 WebSphere Studio Application Developer。如果不是,您仍可使用 Lombok;但是不能享用开发时的种种益处。不过,您仍然可以享用编译时的益处。

首先,打开您的浏览器并将 URL 指向 http://projectlombok.org/。

在撰写本文之时,用这个 URL 打开的页面的右上角会出现一个很大的单词。这个单词是 “Download”。单击该单词并开始下载 lombok.jar。此文件无需解压缩,而从其他站点下载的文件中,99% 都需要解压缩。

下载此文件后,需要执行这个 JAR 文件。在您的操作系统中打开一个提示符,进入到安装了 lombok.jar 的那个目录,并键入 java -jar lombok.jar。

以上假设在您的路径内已经有 Java Runtime Environment (JRE)。如果没有,需要添加它。如果要了解如何添加,可以参考针对您的具体操作系统的相关文档。

如果您使用的是 Microsoft® Windows®,那么还可以双击这个 lombok.jar 图标。同样地,您必须能够从您的图形用户界面(GUI)执行 JAR。

不管采取何种方式,应该最终都能看到一个 Lombok 安装屏幕。该屏幕会提问 Eclipse 或 WebSphere Studio Application Developer 可执行文件位于何处。它的默认位置有可能是正确的。但有时可能需要更改这个默认位置。

单击 Install/Update,Lombok 会被迅速并入 Eclipse 开发环境。如果已经运行了 Eclipse,那么就需要关闭它并重启。

现在,就可以在 Eclipse 或 WebSphere Studio Application Developer 内开始使用 Lombok 了。请参考清单 1 内的代码。

清单 1. Java bean 的一个良好开端

public class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

以上是一个简单的 Java bean 的典型开始。从这里,可以为每个属性添加 getters 和 setters。然后再添加一个 equals() 方法、一个 toString() 方法和一个 hashCode() 方法。

有了 Lombok,您无需自己完成上述操作。相反,您只需添加一个注释:@Data。

没错,就这么简单。清单 2 中包括了 @Data。

清单 2. Java bean 的一个更好的开端

import lombok.Data
public @Data class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

不过请记住,只有当 lombok.jar 位于您的构建路径且 lombok.Data 被导入到这个 Java 类时,上述代码才会奏效。

如果在 Eclipse 或 WebSphere Studio Application Developer 内查看这个类的概要(通常位于屏幕上这个类的右侧),就能看到这些方法会被自动添加到这个 Lure 类。

若不能立即看到这个概要,可以单击 Eclipse 内的 Window 菜单,然后选择 Show View。 从所出现的弹出菜单中,选择 Outline,它应该出现在屏幕的右侧。强制显示类的概要的热键组合是Alt+Shift+Q, 然后是 O

如果您编写了另一个类来实例化 Lure,您将能立刻拥有对 Lure 所暗指的方法(比如getName() 或 setSize())的访问。您还能拥有对 equals()、hashCode() 和 toString()的访问。很棒,对吧?

如果您使用的不是 Eclipse 或 WebSphere Studio Application Developer,那么所暗指的这些方法添加只有在实际编译这些代码时才能被认可。所以虽然在没有 Eclipse 或 WebSphere Studio Application Developer 时仍可以使用 Lombok,但 Lombok 最初的设计目的就是与 Eclipse 或 WebSphere Studio Application Developer 相集成。

在生成 getter/setter 方法时,Lombok 遵从传统的标准。所有这些方法名都以 get 或 set 开头并且属性名都是大写的。当然,如果属性是一个 Boolean,情况例外。在这种情况下,getter 以is 开始,而非 get。这是 Java bean 的一种标准实践。

现在,假设有一个 Java bean 对您的一个 getter 具有特殊要求。在清单 2 的例子中,getStyle()可能返回颜色和大小的组合。在这种情况下,可以按自己的意愿编写 getStyle() 方法的代码。Lombok 检查您的代码并且不会基于这个属性创建其自己的 getStyle 版本。

又假设,您有一个 getter 方法不想公开。为此,Lombok 让您可以输入一个附加参数。清单 3 给出了一个定制的修饰符(modifier)。

清单 3. 一个定制的修饰符

private String name;
	@Getter(AccessLevel.PROTECTED) private int size;
	private String color;
	private String style;

在本例中,getSize() 方法将不会被公开。它具有一个受保护的修饰符,所以它只对派生子类可用并且在 Lure 类本身的内部。

您可能并不总是想接受 Lombok 为您提供的其他默认值。比如,toString() 方法会列出类名以及所有的属性名和值,中间以逗号分割。这个列表出现在类名的旁边。

比如,假设在记录这个 Lure 类时,您并不关心颜色。为了更改 toString() 的默认设置,需要使用 ToString 注释。

清单 4. 修改 toString()

@ToString(exclude="color")
public @Data class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

若输出一个实例化了的 Lure 类,它应该看上去类似于:

Lure(name=Wishy-Washy, size=1, style=trolling)

注意到颜色没有被包括?这是因为您之前用注释告诉过 Lombok 不包括颜色。

您还可以修改 equals() 和 hashCode() 方法该如何被处理。清单 5 很直白,不需要过多解释。

清单 5. 修改 hashCode()

@EqualsAndHashCode(exclude="style")
public @Data class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

在本例中,当 equals() 和 hashCode() 方法生成时,style 属性并没有被包括。

您是不是也一直非常痛恨编写 try/catch/finally 块呢?我是这样的。幸运的是,有了 Lombok,您无需这么做了。这也是 Lombok 消除 Java 冗余的另一种方式。为了消除 try/catch/finally 块的冗余,只需使用 @Cleanup 注释。参见清单 6。

清单 6. 使用 @Cleanup 注释

public static void main(String[] args) throws IOException {
	@Cleanup InputStream in = new FileInputStream(args[0]);
	@Cleanup OutputStream out = new FileOutputStream(args[1]);
	//write file code goes here
}

上述代码较我们通常在标准 Java 代码内看到的整洁了很多。请注意您还是需要抛出由被调用代码捕获的异常(在本例中,为 IOException)。

清单 6 中的这个代码块不仅消除了 try/catch/finally 块,而且还关闭了开放流。如果您处理的对象使用一个方法而不是 close() 来释放资源,那么就需要用一个带附加说明的注释调用该方法。比如,@Cleanup("relinquish")。

Lombok 还可以减少同步方法所需的代码的冗余。很自然,这是用 @Synchronized 方法实现的。

清单 7. 使用 @Synchronized 注释

@Synchronized
private int foo() {
	//some magic done here
	return 1;
}

在本例中,Lombok 会自动创建一个名为 $lock 的实例对象,并会针对该对象同步方法 foo()。

如果用 @Synchronized 注释的这个方法是静态的,那么 Lombok 就会创建一个名为 $LOCK 的类对象,并会针对该对象同步这个方法。

您还可以指定一个对象用以通过一个附加参数进行显式的锁定。比如,@Synchronized("myObject")会针对对象 myObject 同步这个方法。在这种情况下,必须显式地定义它。

使用 Lombok,可以实现所有应用程序开发人员都竭尽全力实现的一个目标:消除冗余。

您还可以让您的代码可读性更好。在 Java bean 内寻找 “特殊”(即不遵循典型的标准)的具有大量属性的 getter 和 setter 方法将更为简便。这是因为只有这些特殊的 getter/setter 方法是需要被实际编码的。

Lombok 有助于代码的整洁、效率的提高以及冗余的减少。为何不在您自己的环境内尝试一下呢?


本文转载自:http://www.oschina.net/question/12_7949

共有 人打赏支持
qqli
粉丝 9
博文 30
码字总数 7349
作品 0
丰台
程序员
Lombok 1.18.0 发布,消除冗长的 Java 代码

Lombok 1.18.0 已发布,更新如下: BREAKING CHANGE: 在 1.16.22 引入的可配置 key 现在默认为 。Issue #1708 BUGFIX: Do not generate a private no-args constructor if that breaks the ......

淡漠悠然
06/07
0
0
java 10 的局部变量类型推导(Local Variable Type Inference )

其实说到变量类型推导,我们很容易连联想到一些脚本语言,在(http://openjdk.java.net/jeps/286)中,java提出这个新特性。 Enhance the Java Language to extend type inference to declar...

woshixin
06/16
0
0
刚了解到的Lombok,记一下

前言: 逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下。 lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。特别是相对于 POJO...

吴海宏
2014/10/21
0
0
【转】使用Lombok来优雅的编码

前言 是一种 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。 正文 添加依赖 在 pom.xml 文件中添加相关依赖: 转换后就是:...

HAVENT
07/16
0
0
Lombok: Java开发的利器

Lombok是一个旨在减少代码开发工作的Java库。本文介绍了如何用它来完成getter/setter方法,构造方法,以及重写equals(),hashCode()和toString()方法。在Java中,一个很简单的类却往往写得特...

陶邦仁
2015/03/08
0
0
sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer
05/03
0
0
SpringBoot | 第二章:lombok介绍及简单使用

在去北京培训的时候,讲师说到了这个第三方插件包,使用了之后发现,确实是个神奇,避免了编写很多臃肿的且定式的代码,虽然现代的都能通过快捷键或者右键的方式,使用快速生成setters/gette...

oKong
07/15
0
0
对JDBC的支持 之 7.1 概述

概述 JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: //cn.javass.spring.chapter7. TraditionalJdbcTest @Test public void test() throws Exception { Connection co...

heroShane
2014/02/27
0
0
为什么Scala能进入TIOBE发布的5月编程语言榜单中?

     首先简单介绍一下Scala语言。Scala创建于2003年,专门用来解决Java程序员所遇到的一系列问题的,比如代码冗长,性能差。它能够进入到TIOBE刚刚发布的编程语言榜单的原因是它的优势和...

张旭乾
05/07
0
0
SpringMVC接收xml格式参数

问题 在对接银行过程中,银行回调时请求参数格式为xml,要求返回格式也为xml(CDATA包裹),利用SpringMVC该怎么处理。 测试 xml格式参数为: 提供接受参数的对象 返回参数对象 处理xml格式参数...

寒武没有纪
07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
13分钟前
0
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
27分钟前
14
0
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
38分钟前
0
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
44分钟前
0
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
58分钟前
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
今天
0
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
今天
0
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
今天
0
0
安装tensorflow-XXX报错

报错: tensorflow-0.5.0-cp27-none-linux_x86_64.whl is not a supported wheel on this platform. 解决: wget https://bootstrap.pypa.io/get-pip.py sudo python2.7 get-pip.py sudo p......

Yao--靠自己
今天
0
0
JVM学习手册(一):JVM模型

一直从事JAVA开发,天天和JVM打交道,仔细想想对JVM还真的不是特别了解,实在是不应该.周六看了许多资料,也算有点心得,记录一下。 JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计...

勤奋的蚂蚁
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部