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

分享 Java 开发的利器-Lombok

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

    译注: 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
    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     Solana     5448 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 09:12 PVG 17:12 LAX 02:12 JFK 05:12
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86