V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lampbrother
V2EX  ›  Java

分享 Java 开发的利器-Lombok

  •  
  •   lampbrother · 2016-07-21 11:43:36 +08:00 · 8145 次点击
    这是一个创建于 3043 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    60 条回复    2016-08-05 09:27:33 +08:00
    Override
        1
    Override  
       2016-07-21 11:47:53 +08:00
    我仿佛又听到有人在背后偷偷 @我
    chocotan
        2
    chocotan  
       2016-07-21 12:00:16 +08:00
    需要大伙儿全部装一下插件,不然导入工程一大片红色错误
    m1a0
        3
    m1a0  
       2016-07-21 12:19:15 +08:00
    @Override haha
    arfaWong
        4
    arfaWong  
       2016-07-21 12:21:30 +08:00
    @Override 真的能收到 @你 的消息提示吗? 23333333
    Override
        5
    Override  
       2016-07-21 12:27:50 +08:00
    @arfaWong 收到啊
    WispZhan
        6
    WispZhan  
       2016-07-21 12:49:40 +08:00
    还是 Kotlin 好,几乎和 java 无缝兼容。
    lowzoom
        7
    lowzoom  
       2016-07-21 12:59:15 +08:00
    @Override 坐等 ToString 来报道
    param
        8
    param  
       2016-07-21 13:04:02 +08:00
    @lowzoom @Override 是我另一个号
    beneo
        9
    beneo  
       2016-07-21 13:06:53 +08:00
    Groovy 搞定一切
    INW017bzMfgkkYGn
        10
    INW017bzMfgkkYGn  
       2016-07-21 13:07:04 +08:00   ❤️ 1
    @Override 同被很多 Linux 话题自动 @ ~
    Sharuru
        11
    Sharuru  
       2016-07-21 13:11:21 +08:00
    = = @Data
    guoziyan
        12
    guoziyan  
       2016-07-21 13:16:13 +08:00
    Scala 大法好
    lytofb
        13
    lytofb  
       2016-07-21 13:21:24 +08:00
    现在兄弟连的都上 v2 了么
    Bairrfhoinn
        14
    Bairrfhoinn  
       2016-07-21 13:52:58 +08:00
    谢谢楼主分享,我就是写 Java 代码的,这东西对我而言非常有用,相见恨晚。
    ihuotui
        15
    ihuotui  
       2016-07-21 13:59:47 +08:00 via Android
    就是利用了注解吧
    shooter
        16
    shooter  
       2016-07-21 13:59:50 +08:00
    Kotlin 大法好
    windyboy
        17
    windyboy  
       2016-07-21 14:39:41 +08:00
    注解已经快像 XML 配置文件一样冗长了

    我真觉得动态语言才是正路
    groovy / scala
    vcshui
        18
    vcshui  
       2016-07-21 14:47:17 +08:00 via Android
    Animal.sex 是不是更好点,一般只有 HumanBing.sex 或者 HumanBing.gender
    YzSama
        19
    YzSama  
       2016-07-21 14:52:16 +08:00
    @windyboy 然而需求还是 java 多啊。
    stackboom
        20
    stackboom  
       2016-07-21 15:17:05 +08:00
    为啥不写 c# public string name{get; set;}
    VictoryMiKi
        21
    VictoryMiKi  
       2016-07-21 15:19:05 +08:00
    @chocotan 一语点破啊
    rockyou12
        22
    rockyou12  
       2016-07-21 15:19:39 +08:00
    然后 idea 的 generate 功能已经够了……反正不用手写怎么都是一样的
    awanabe
        23
    awanabe  
       2016-07-21 15:20:25 +08:00
    4,5 年前 我还在写 Java 的时候, 就用这个插件了吧...
    icybee
        24
    icybee  
       2016-07-21 15:22:55 +08:00
    @Override 可以的。。。这名字
    mx1700
        25
    mx1700  
       2016-07-21 15:23:38 +08:00
    Kotlin 大法好
    Coande
        26
    Coande  
       2016-07-21 15:47:28 +08:00
    广告打得好
    Coande
        27
    Coande  
       2016-07-21 15:50:38 +08:00
    @Override 屌屌的
    acoder2013
        28
    acoder2013  
       2016-07-21 15:57:36 +08:00
    太麻烦,还要插件。。。
    BlueMeow
        29
    BlueMeow  
       2016-07-21 16:47:54 +08:00
    这个很好用的, Maven 增加几行就自动载入了( Intellij IDEA 还有插件)
    hantsy
        30
    hantsy  
       2016-07-21 17:14:09 +08:00
    用了好多年了。。。一般直接加个 @Data ( Getters, Setters, Hashcoce, equals, toString ) 就行了。
    hantsy
        31
    hantsy  
       2016-07-21 17:24:51 +08:00
    Lombok 的 Builder 用得比较多。。。

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

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

    这个加个 @Log 也不错的
    archer2ee
        38
    archer2ee  
       2016-07-21 19:47:34 +08:00 via iPhone
    差点以为进了 c#区
    aitaii
        39
    aitaii  
       2016-07-21 20:27:49 +08:00
    get set 还要手写吗。。。。
    jeremaihloo
        40
    jeremaihloo  
       2016-07-21 20:53:58 +08:00 via Android
    @archer2ee c#语法真的是比 java 舒服太多
    0915240
        41
    0915240  
       2016-07-21 20:55:02 +08:00
    我想问 如果这样子的话 我其他地方要显示的 getSomeProperty() 怎么办, idea 飘红不管吗
    Delbert
        42
    Delbert  
       2016-07-21 21:03:00 +08:00 via Android
    @0915240 idea 有插件啊,装上就好。
    0915240
        43
    0915240  
       2016-07-21 21:10:01 +08:00
    @Delbert 找了 wiki 看了下,搜嘎,谢谢分享
    Override
        44
    Override  
       2016-07-21 21:23:38 +08:00 via Android
    Linux 有 @default 的?
    hinkal
        45
    hinkal  
       2016-07-21 23:30:39 +08:00 via Android
    所以总结下楼上发言:这玩意儿确实方便,然而 idea 的自动生成与重构能完全达到相同的效果,还不会出现兼容问题。 idea :怪我咯?
    maomaomao001
        46
    maomaomao001  
       2016-07-21 23:39:09 +08:00 via Android
    试试 kotlin
    fashioncj
        47
    fashioncj  
       2016-07-21 23:51:20 +08:00
    get/set 不是可以一键插入么- -以及 tostring 。。这种就没必要再装一个插件了我觉得。。
    xiluo
        48
    xiluo  
       2016-07-22 08:40:04 +08:00
    用过,挺好的,只说有不足之处: 1. 这个东西需要征求团队里面其他人的意见,因为需要 IDE 的插件; 2. 对于 domain class 来说,有时可能会出现 circle reference 。
    ppwangs
        49
    ppwangs  
       2016-07-22 08:58:55 +08:00
    从 eclipse 的时代就开始用了,对于代码整洁很有帮助。
    hhh
        50
    hhh  
       2016-07-22 09:33:27 +08:00
    不想写 getter , setter ,用 public field 其实也是可以的。
    yuankui
        51
    yuankui  
       2016-07-22 09:37:29 +08:00
    高富帅,玩 groovy ,这些问题不纠结~
    iyoood
        52
    iyoood  
       2016-07-22 09:39:51 +08:00
    把原生 Java 代码写好再说
    cppgohan
        53
    cppgohan  
       2016-07-22 09:46:50 +08:00
    lombok 之前看介绍是会直接修改 A.java 最终生成的 A.class 内容, 如果调试的话, 是会定位到生成代码是吧?
    qiyuey
        54
    qiyuey  
       2016-07-22 10:22:13 +08:00
    @EXE 那直接省掉重构功能不是更好吗
    yannxia
        55
    yannxia  
       2016-07-22 11:04:21 +08:00
    Lombok Idea 装个插件很好用··不会有标红
    hantsy
        56
    hantsy  
       2016-07-22 12:35:11 +08:00
    @liuchenwei2000 重构字段名能够修改相应的 getters, setters, 的 Builder 的中的方法吗?
    winglight2016
        57
    winglight2016  
       2016-07-22 16:41:01 +08:00
    @shooter kotlin 看起来好像一个弱化版的 scala 啊?
    clorts
        58
    clorts  
       2016-07-23 11:00:29 +08:00
    @guoziyan 好个屁啊
    nikola
        59
    nikola  
       2016-07-31 21:17:20 +08:00
    @Override 赶紧再注册个 Overload 的 ID ,哇咔咔
    shaozhengmao
        60
    shaozhengmao  
       2016-08-05 09:27:33 +08:00
    以前用过,推荐给同事想在项目里应用,反响平平,不了了之。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1194 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:38 · PVG 02:38 · LAX 10:38 · JFK 13:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.