
译注: Lombok 是一个很老的项目了,也非常实用,但奇怪的是这么多年来似乎一直不温不火。很多 Lombok 特性可以参考它的官网介绍哈。兄弟连教育在这里只是简单介绍一下它的基础功能。
Lombok 是一个旨在减少代码开发工作的 Java 库。兄弟连在本文介绍了如何用它来完成 getter/setter 方法,构造方法,以及重写 equals(), hashCode()和 toString()方法。在 Java 中,一个很简单的类却往往写得特别复杂。如果你没听说过 Lombok 的话,那它肯定会让你满意的。
Lombok 可以帮助 Java 开发人员完成以下这些事情:
不用再写 setter/getter 方法了 不用 Lombok 的话,我们通常都得这么写:
public class Animal {
private String name; private String gender; private String species; public String getName(){ return this.name; } public void setName(String name){ this.name = name; } public String getGender(){ return this.gender; } public void setGender(String gender){ this.gender = gender; } public String getSpecies(){ return this.species; } public void setSpecies(String species){ this.species = species; } } 这些方法写多了之后,我慢慢开始有点讨厌 Java 了。
有了 Lombok 之后:
public class Animal {
@Getter @Setter private String name; @Getter @Setter private String gender; @Getter @Setter private String species; } 日子开始变得滋润多了。 下面还有 Lombok 其它的一些很棒的特性。
不用再重写 toString 方法。 可以给类加上 @ToString 注解, Lombok 会自动重写 toString 方法并打印出类的所有字段。
不用再重写 equals 和 hashCode 方法 @EqualsAndHashCode 注解可以自动生成这些方法
通过类注解来生成构造方法 @NoArgsConstructor 生成一个默认的构造方法 @RequiredArgsConstructor 为所有 final 和非空(译注:带有 @NonNull 注解)字段生成一个构造方法 @AllArgsConstructor 会为所有字段生成一个构造方法
@Data 是 @ToString, @EqualsAndHashCode, @RequiredArgsConstructor, 和 @Getter / @Setter 这些注解的一个快捷方式。
这些是最常用到的 Lombok 特性。其它的一些功能可以到它的项目主页上进行了解。
示例 假设我们有一个类是需要支持序列化的,并且需要一个构造方法。这需要重写 equals,hashCode,toString,同时为私有成员变量提供 setter/getter 方法,并实现一个构造方法。
使用了 Lombok
@RequiredArgsConstructor @ToString @EqualsAndHashCode public class Animal { @Getter @Setter private String name; @Getter @Setter private String gender; @Getter @Setter private String species; } 没有使用 Lombok :
public class Animal {
private String name; private String gender; private String species; public Animal(String name, String gender, String species) { this.name = name; this.gender = gender; this.species = species; } public String getName(){ return this.name; } public void setName(String name){ this.name = name; } public String getGender(){ return this.gender; } public void setGender(String gender){ this.gender = gender; } public String getSpecies(){ return this.species; } public void setSpecies(String species){ this.species = species; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Animal)) return false; Animal animal = (Animal) o; if (gender != null ? !gender.equals(animal.gender) : animal.gender != null) return false; if (name != null ? !name.equals(animal.name) : animal.name != null) return false; if (species != null ? !species.equals(animal.species) : animal.species != null) return false; return true; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (gender != null ? gender.hashCode() : 0); result = 31 * result + (species != null ? species.hashCode() : 0); return result; } @Override public String toString() { return Objects.toStringHelper(this) //Using guava library objects toString .add("name", name) .add("gender", gender) .add("species", species) .toString(); } } 很多 Java 开发人员会争辩道,"有加注解的那个工夫, IDE 早就把这些代码给生成了!"
我想说的是你没有说到点子上。人们不喜欢 Java 是因为它的代码里必须要有这些乱七八糟的东西。像 Ruby, Groovy, Perl 或者别的脚本语言,都比这简单多了。简单即是美,兄弟连小编觉得 Lombok 和 Java 很般配呢。
1 Override Jul 21, 2016 我仿佛又听到有人在背后偷偷 @我 |
2 chocotan Jul 21, 2016 需要大伙儿全部装一下插件,不然导入工程一大片红色错误 |
6 WispZhan Jul 21, 2016 还是 Kotlin 好,几乎和 java 无缝兼容。 |
9 beneo Jul 21, 2016 Groovy 搞定一切 |
10 INW017bzMfgkkYGn Jul 21, 2016 @Override 同被很多 Linux 话题自动 @ ~ |
12 guoziyan Jul 21, 2016 Scala 大法好 |
13 lytofb Jul 21, 2016 现在兄弟连的都上 v2 了么 |
14 Bairrfhoinn Jul 21, 2016 谢谢楼主分享,我就是写 Java 代码的,这东西对我而言非常有用,相见恨晚。 |
15 ihuotui Jul 21, 2016 via Android 就是利用了注解吧 |
16 shooter Jul 21, 2016 Kotlin 大法好 |
17 windyboy Jul 21, 2016 注解已经快像 XML 配置文件一样冗长了 我真觉得动态语言才是正路 groovy / scala |
18 vcshui Jul 21, 2016 via Android Animal.sex 是不是更好点,一般只有 HumanBing.sex 或者 HumanBing.gender |
20 stackboom Jul 21, 2016 为啥不写 c# public string name{get; set;} |
21 VictoryMiKi Jul 21, 2016 @chocotan 一语点破啊 |
22 rockyou12 Jul 21, 2016 然后 idea 的 generate 功能已经够了……反正不用手写怎么都是一样的 |
23 awanabe Jul 21, 2016 4,5 年前 我还在写 Java 的时候, 就用这个插件了吧... |
25 mx1700 Jul 21, 2016 Kotlin 大法好 |
26 Coande Jul 21, 2016 广告打得好 |
28 acoder2013 Jul 21, 2016 太麻烦,还要插件。。。 |
29 BlueMeow Jul 21, 2016 这个很好用的, Maven 增加几行就自动载入了( Intellij IDEA 还有插件) |
31 hantsy Jul 21, 2016 |
32 zonghua Jul 21, 2016 |
33 michaelye1988 Jul 21, 2016 不错 |
34 liuchenwei2000 Jul 21, 2016 via Android 这玩意比 IDE 自动生成最大的好处是,当你增加,删除字段,或修改字段名时,根本不用调整其他地方。 |
36 EXE Jul 21, 2016 @liuchenwei2000 利用 IDEA 的重构功能只修改字段名就好了 |
38 archer2ee Jul 21, 2016 via iPhone 差点以为进了 c#区 |
39 aitaii Jul 21, 2016 get set 还要手写吗。。。。 |
40 jeremaihloo Jul 21, 2016 via Android @archer2ee c#语法真的是比 java 舒服太多 |
41 0915240 Jul 21, 2016 我想问 如果这样子的话 我其他地方要显示的 getSomeProperty() 怎么办, idea 飘红不管吗 |
45 hinkal Jul 21, 2016 via Android 所以总结下楼上发言:这玩意儿确实方便,然而 idea 的自动生成与重构能完全达到相同的效果,还不会出现兼容问题。 idea :怪我咯? |
46 maomaomao001 Jul 21, 2016 via Android 试试 kotlin |
47 fashioncj Jul 21, 2016 get/set 不是可以一键插入么- -以及 tostring 。。这种就没必要再装一个插件了我觉得。。 |
48 xiluo Jul 22, 2016 用过,挺好的,只说有不足之处: 1. 这个东西需要征求团队里面其他人的意见,因为需要 IDE 的插件; 2. 对于 domain class 来说,有时可能会出现 circle reference 。 |
49 ppwangs Jul 22, 2016 从 eclipse 的时代就开始用了,对于代码整洁很有帮助。 |
50 hhh Jul 22, 2016 不想写 getter , setter ,用 public field 其实也是可以的。 |
51 yuankui Jul 22, 2016 高富帅,玩 groovy ,这些问题不纠结~ |
52 iyoood Jul 22, 2016 把原生 Java 代码写好再说 |
53 cppgohan Jul 22, 2016 lombok 之前看介绍是会直接修改 A.java 最终生成的 A.class 内容, 如果调试的话, 是会定位到生成代码是吧? |
55 Yanickkk Jul 22, 2016 Lombok Idea 装个插件很好用不会有标红 |
56 hantsy Jul 22, 2016 @liuchenwei2000 重构字段名能够修改相应的 getters, setters, 的 Builder 的中的方法吗? |
57 winglight2016 Jul 22, 2016 @shooter kotlin 看起来好像一个弱化版的 scala 啊? |
60 shaozhengmao Aug 5, 2016 以前用过,推荐给同事想在项目里应用,反响平平,不了了之。 |