分享 Java 开发的利器-Lombok

2016-07-21 11:43:36 +08:00
 lampbrother

译注: 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 很般配呢。

8145 次点击
所在节点    Java
60 条回复
VictoryMiKi
2016-07-21 15:19:05 +08:00
@chocotan 一语点破啊
rockyou12
2016-07-21 15:19:39 +08:00
然后 idea 的 generate 功能已经够了……反正不用手写怎么都是一样的
awanabe
2016-07-21 15:20:25 +08:00
4,5 年前 我还在写 Java 的时候, 就用这个插件了吧...
icybee
2016-07-21 15:22:55 +08:00
@Override 可以的。。。这名字
mx1700
2016-07-21 15:23:38 +08:00
Kotlin 大法好
Coande
2016-07-21 15:47:28 +08:00
广告打得好
Coande
2016-07-21 15:50:38 +08:00
@Override 屌屌的
acoder2013
2016-07-21 15:57:36 +08:00
太麻烦,还要插件。。。
BlueMeow
2016-07-21 16:47:54 +08:00
这个很好用的, Maven 增加几行就自动载入了( Intellij IDEA 还有插件)
hantsy
2016-07-21 17:14:09 +08:00
用了好多年了。。。一般直接加个 @Data ( Getters, Setters, Hashcoce, equals, toString ) 就行了。
hantsy
2016-07-21 17:24:51 +08:00
Lombok 的 Builder 用得比较多。。。

类似还有 https://immutables.github.io/getstarted.html
zonghua
2016-07-21 17:26:25 +08:00
@SpringBootApplication

之前还看到一个类似的工具,只要在类名上注解就把全部生成 GetSet
michaelye1988
2016-07-21 18:08:21 +08:00
不错
liuchenwei2000
2016-07-21 18:19:52 +08:00
这玩意比 IDE 自动生成最大的好处是,当你增加,删除字段,或修改字段名时,根本不用调整其他地方。
Symars
2016-07-21 18:39:19 +08:00
@override ,@getter ,@setter ,@resource
EXE
2016-07-21 19:33:07 +08:00
@liuchenwei2000 利用 IDEA 的重构功能只修改字段名就好了
phx13ye
2016-07-21 19:42:04 +08:00
@Bean

这个加个 @Log 也不错的
archer2ee
2016-07-21 19:47:34 +08:00
差点以为进了 c#区
aitaii
2016-07-21 20:27:49 +08:00
get set 还要手写吗。。。。
jeremaihloo
2016-07-21 20:53:58 +08:00
@archer2ee c#语法真的是比 java 舒服太多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/293890

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX