------------------------------------------------------------------------------------ java
Lombok 是一种 Java Archive (JAR) 文件,可用来消除 Java 代码的冗长。 浏览器
咱们看这样一个例子,一个标准的 Java bean。一个典型的 Java bean 通常具备几个属性。每一个属性具备一个 accessor 和 mutator(getter 和 setter)。一般还会有一个 toString() 方法、一个equals() 方法和一个 hashCode() 方法。 ui
初看上去,其中可预见的冗余就已经很是多了。若是每一个属性都具备一个 getter 和 setter,而且一般如此,那么又何须详细说明呢? 编码
让咱们来看看 Lombok。为了消除代码行,Lombok 使用注释来标识类和 Java 代码块。在前述的那个 Java bean 示例中,全部的 getter、setter 以及其余三个方法都是在编译时被暗示并包括进来的。 spa
并且更好的是若是您使用的是 Eclipse 或 IBM® WebSphere® Studio Application Developer(若是还没用的话,建议最好使用),您就能够将 Lombok 集成到 Java 项目并即刻得到开发时结果。换言之,Eclipse 编译器能够当即识别所暗指的 getters/setters,而其余 Java 代码则可引用这些方法。 操作系统
最直接的好处固然是代码行的减小,这真的很棒。而且,若是有一个特定的 getter 或 setter 须要特别的注意,那么您就没必要为了找到这个特定的 getter 或 setter 而遍历数十行代码。代码也会更为简洁而且冗余也少了。 设计
Lombok 还让您得以简化代码的其余部分 — 不只仅是 Java bean。好比,还能够减小 try/catch/finally 块内以及同步方法内的冗余代码。 code
-----------------------------------绿字部分讲的是lombok的安装 对象
如今,咱们来看看在您本身的开发环境中如何能实现上述目的。 ip
要进行安装,本文假设您使用的是 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 内的代码。
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。
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)。
private String name; @Getter(AccessLevel.PROTECTED) private int size; private String color; private String style; |
在本例中,getSize() 方法将不会被公开。它具备一个受保护的修饰符,因此它只对派生子类可用而且在 Lure 类自己的内部。
您可能并不老是想接受 Lombok 为您提供的其余默认值。好比,toString() 方法会列出类名以及全部的属性名和值,中间以逗号分割。这个列表出如今类名的旁边。
好比,假设在记录这个 Lure 类时,您并不关心颜色。为了更改 toString() 的默认设置,须要使用 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 很直白,不须要过多解释。
@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。
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 方法实现的。
@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 有助于代码的整洁、效率的提升以及冗余的减小。为什么不在您本身的环境内尝试一下呢?