以简单的方式消除Java冗余

开发 后端
Lombok是一种Java实用工具,可用来帮助开发人员消除Java的冗长,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。

Lombok是一种JavaArchive(JAR)文件,可用来消除Java代码的冗长。通过在开发环境中实现Lombok,开发人员可以节省构建诸如hashCode()和equals()这样的方法以及以往用来分类各种accessor和mutator的大量时间。

我们看这样一个例子,一个标准的Javabean。一个典型的Javabean一般具有几个属性。每个属性具有一个accessor和mutator(getter和setter)。通常还会有一个toString()方法、一个equals()方法和一个hashCode()方法。初看上去,其中可预见的冗余就已经非常多了。如果每个属性都具有一个getter和setter,并且通常如此,那么又何必详细说明呢?

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

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

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

Lombok还让您得以简化代码的其他部分—不仅仅是Javabean。比如,还可以减少try/catch/finally块内以及同步方法内的冗余代码。现在,我们来看看在您自己的开发环境中如何能实现上述目的。

安装Lombok

要进行安装,本文假设您使用的是Eclipse或WebSphereStudioApplicationDeveloper。如果不是,您仍可使用Lombok;但是不能享用开发时的种种益处。不过,您仍然可以享用编译时的益处。首先,打开您的浏览器并将URL指向http://projectlombok.org/。

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

下载此文件后,需要执行这个JAR文件。在您的操作系统中打开一个提示符,进入到安装了lombok.jar的那个目录,并键入java-jarlombok.jar。以上假设在您的路径内已经有JavaRuntimeEnvironment(JRE)。如果没有,需要添加它。如果要了解如何添加,可以参考针对您的具体操作系统的相关文档。如果您使用的是Microsoft®Windows®,那么还可以双击这个lombok.jar图标。同样地,您必须能够从您的图形用户界面(GUI)执行JAR。

不管采取何种方式,应该最终都能看到一个Lombok安装屏幕。该屏幕会提问Eclipse或WebSphereStudioApplicationDeveloper可执行文件位于何处。它的默认位置有可能是正确的。但有时可能需要更改这个默认位置。单击Install/Update,Lombok会被迅速并入Eclipse开发环境。如果已经运行了Eclipse,那么就需要关闭它并重启。

使用Lombok

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

  1. 清单1.Javabean的一个良好开端  
  2. publicclassLure{  
  3.  privateStringname;  
  4.  privateintsize;  
  5.  privateStringcolor;  
  6.  privateStringstyle;  

以上是一个简单的Javabean的典型开始。从这里,可以为每个属性添加getters和setters。然后再添加一个equals()方法、一个toString()方法和一个hashCode()方法。有了Lombok,您无需自己完成上述操作。相反,您只需添加一个注释:@Data。没错,就这么简单。清单2中包括了@Data。

  1. 清单2.Javabean的一个更好的开端  
  2. importlombok.Data  
  3. public@DataclassLure{  
  4.  privateStringname;  
  5.  privateintsize;  
  6.  privateStringcolor;  
  7.  privateStringstyle;  

不过请记住,只有当lombok.jar位于您的构建路径且lombok.Data被导入到这个Java类时,上述代码才会奏效。如果在Eclipse或WebSphereStudioApplicationDeveloper内查看这个类的概要(通常位于屏幕上这个类的右侧),就能看到这些方法会被自动添加到这个Lure类。

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

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

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

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

现在,假设有一个Javabean对您的一个getter具有特殊要求。在清单2的例子中,getStyle()可能返回颜色和大小的组合。在这种情况下,可以按自己的意愿编写getStyle()方法的代码。Lombok检查您的代码并且不会基于这个属性创建其自己的getStyle版本。又假设,您有一个getter方法不想公开。为此,Lombok让您可以输入一个附加参数。清单3给出了一个定制的修饰符(modifier)。

  1. 清单3.一个定制的修饰符  
  2. privateStringname;  
  3. @Getter(AccessLevel.PROTECTED)privateintsize;  
  4. privateStringcolor;  
  5. privateStringstyle; 

在本例中,getSize()方法将不会被公开。它具有一个受保护的修饰符,所以它只对派生子类可用并且在Lure类本身的内部。您可能并不总是想接受Lombok为您提供的其他默认值。比如,toString()方法会列出类名以及所有的属性名和值,中间以逗号分割。这个列表出现在类名的旁边。比如,假设在记录这个Lure类时,您并不关心颜色。为了更改toString()的默认设置,需要使用ToString注释。 #p#

  1. 清单4.修改toString()  
  2. @ToString(exclude="color")  
  3. public@DataclassLure{  
  4.  privateStringname;  
  5.  privateintsize;  
  6.  privateStringcolor;  
  7.  privateStringstyle;  

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

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

注意到颜色没有被包括?这是因为您之前用注释告诉过Lombok不包括颜色。您还可以修改equals()和hashCode()方法该如何被处理。清单5很直白,不需要过多解释。

  1. 清单5.修改hashCode()  
  2. @EqualsAndHashCode(exclude="style")  
  3. public@DataclassLure{  
  4.  privateStringname;  
  5.  privateintsize;  
  6.  privateStringcolor;  
  7.  privateStringstyle;  

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

其他特性

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

  1. 清单6.使用@Cleanup注释  
  2. publicstaticvoidmain(String[]args)throwsIOException{  
  3. @CleanupInputStreamin=newFileInputStream(args[0]);  
  4. @CleanupOutputStreamout=newFileOutputStream(args[1]);  
  5. //writefilecodegoeshere  

上述代码较我们通常在标准Java代码内看到的整洁了很多。请注意您还是需要抛出由被调用代码捕获的异常(在本例中,为IOException)。清单6中的这个代码块不仅消除了try/catch/finally块,而且还关闭了开放流。如果您处理的对象使用一个方法而不是close()来释放资源,那么就需要用一个带附加说明的注释调用该方法。比如,@Cleanup("relinquish")。Lombok还可以减少同步方法所需的代码的冗余。很自然,这是用@Synchronized方法实现的。

  1. 清单7.使用@Synchronized注释  
  2. @Synchronized  
  3. privateintfoo(){  
  4.  //somemagicdonehere  
  5.  return1;  

在本例中,Lombok会自动创建一个名为$lock的实例对象,并会针对该对象同步方法foo()。如果用@Synchronized注释的这个方法是静态的,那么Lombok就会创建一个名为$LOCK的类对象,并会针对该对象同步这个方法。您还可以指定一个对象用以通过一个附加参数进行显式的锁定。比如,@Synchronized("myObject")会针对对象myObject同步这个方法。在这种情况下,必须显式地定义它。

结束语

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

您还可以让您的代码可读性更好。在Javabean内寻找“特殊”(即不遵循典型的标准)的具有大量属性的getter和setter方法将更为简便。这是因为只有这些特殊的getter/setter方法是需要被实际编码的。Lombok有助于代码的整洁、效率的提高以及冗余的减少。为何不在您自己的环境内尝试一下呢?

【编辑推荐】

  1. Java编程语言的优点快递
  2. JavaBean的任务和设计注意事项
  3. 自学Javabean迅速成为Java高手
  4. 在JSP页面中的应用JavaBean
  5. JSP+JavaBean+Servlet工作原理实例讲解
责任编辑:王晓东 来源: IBM
相关推荐

2012-07-27 10:30:12

重构

2013-09-05 09:50:11

C++代码优化

2020-11-10 08:54:55

Lombok

2010-12-30 10:10:06

NetLinux学习

2024-02-19 07:30:00

AI模型

2022-07-22 08:18:28

JARJava对象

2019-12-12 10:46:15

Kubernetes容器系统

2022-04-27 09:39:11

Mixin工具

2019-01-29 18:29:26

区块链区块链技术网络信任

2022-04-29 14:19:10

网络专家网络攻击

2010-05-04 16:39:04

华为印度禁华

2016-12-06 20:03:48

Flink流处理谬见

2009-07-02 16:36:58

Python程序

2022-12-30 11:05:40

Rust代码

2016-12-05 14:03:07

Flink大数据

2010-08-26 13:38:45

DHCP冗余

2013-03-08 02:46:00

个人开发APP

2012-04-29 10:56:34

APP

2017-09-25 10:51:16

替换字体方式

2012-09-17 10:35:41

JavaScriptJS代码
点赞
收藏

51CTO技术栈公众号