Lombok 到底应不应该使用? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cmower
V2EX    Java

Lombok 到底应不应该使用?

  •  
  •   cmower
    qinggee 2019-05-08 14:01:00 +08:00 13684 次点击
    这是一个创建于 2349 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前写了一篇《干啥呢,Lombok 》,读者反响不错。

    有一些批评的声音:使用 Lombok 等于强 X 了你的队友,他们也必须使用,否则代码就编译不通过。

    但我自己的体验是,省去 getter/setter 似乎真的很省心。

    V 站的朋友们,你们觉得呢?

    80 条回复    2019-05-21 13:26:09 +08:00
    asdf17128
        1
    asdf17128  
       2019-05-08 14:45:20 +08:00   6
    队友被强 X 了之后表示很开心
    allanzhuo
        2
    allanzhuo  
       2019-05-08 14:50:19 +08:00
    Lombok 不只有 get set,还有很多其他的实用功能。被强 X 的没坏处
    Raymon111111
        3
    Raymon111111  
       2019-05-08 14:53:51 +08:00
    省掉 get/set 并没有带来多大的好处
    waising
        4
    waising  
       2019-05-08 14:56:55 +08:00
    lombok 只是为了 get/set 不如引入 kotlin
    adzchao
        5
    adzchao  
       2019-05-08 15:01:08 +08:00
    难道你们只知道 lombok 这么片面的功能么?除了 get/set 就没别的了?麻烦看一下官方文档 OK ?
    adzchao
        6
    adzchao  
       2019-05-08 15:01:29 +08:00
    sorry 不是你们 是你
    @waising
    specita
        7
    specita  
       2019-05-08 15:02:48 +08:00
    用 ide 自动生成也能应付大多数场景了,所以用不用看大家喜好吧,但是 lombok 还提供其它实用功能,比如 builder,要用 lombok 最好还是要知道生成的到底是些什么代码比较好
    /td>
    qiyuey
        8
    qiyuey  
       2019-05-08 15:02:51 +08:00
    Kotlin 欢迎你
    Sendya
        9
    Sendya  
       2019-05-08 15:07:49 +08:00   7
    你还可以用 @RequiredArgsConstructor 来代替原本使用 @Autowired 或 @Resource 注入,省去写构造
    你还可以写 @Slf4j 来自动生成 log 免去手写行,直接使用 log
    你还可以 @toString @EqualsAndHashCode 等各种
    你还可以...

    ![]( https://i.loli.net/2019/05/08/5cd2803bd34c4.png)
    Resource
        10
    Resource  
       2019-05-08 15:09:54 +08:00   15
    @Sendya #9 好的
    Le4fun
        11
    Le4fun  
       2019-05-08 15:10:25 +08:00
    楼主贴下《干啥呢,Lombok 》呗
    Sendya
        12
    Sendya  
       2019-05-08 15:13:03 +08:00
    @Resource 哈哈哈哈过分了这 ID 居然也有
    loveCoding
        13
    loveCoding  
       2019-05-08 15:13:23 +08:00
    手指断了别怪我
    Sharuru
        14
    Sharuru  
       2019-05-08 15:18:38 +08:00
    正如 5 楼所说,Lombok 的功能不仅是 getter/setter。

    团队开发中,用不用,怎么用,很多时候不是一个普通成员能决定的,如果要用,就算不服也得用。较为规模的项目一整套开发规范不是白写的。

    平常站里没见几个写 Java 的,但是一旦碰到这种可以撕逼的问题,仿佛人均 Java 开发十年。
    passerbytiny
        15
    passerbytiny  
       2019-05-08 15:23:18 +08:00   2
    某 Spring 开发者:快看这有个超级好用的 lombok。( Spring 有些文档中已经只提供使用了 lombok 的代码示例)
    某专职代码评审员:别给我添麻烦,用 lombok 的一律扣分。

    团队文化决定了是该不该用。
    Jrue0011
        16
    Jrue0011  
       2019-05-08 15:24:24 +08:00
    start.spring.io 输入 lombok 是有结果的...
    bdnet
        17
    bdnet  
       2019-05-08 15:27:30 +08:00
    用 Git 是不是 QJ 了喜欢用 SVN 的同学?

    Java 后面更新也有吸收 Lombok 的特性。比如 var
    jorneyr
        18
    jorneyr  
       2019-05-08 15:30:42 +08:00   3
    我们规定了必须用 Lombok,因为吃过亏,有的 Bean 几十个属性,增加或者修改属性的时候不小心就会忘了修改 getter 或者 setter,导致前端提交的数据服务器端没有得到而产生 Bug,查找了很久发现原来是新增加的属性忘了增加 setter。
    thisisgpy
        19
    thisisgpy  
       2019-05-08 15:52:19 +08:00
    SpringBoot starter 的组件可选列表里面有 Lombok
    EmdeBoas
        20
    EmdeBoas  
       2019-05-08 16:07:06 +08:00
    当项目中不止 java 的时候就不该用了...比如混入了 groovy,不过大部分人吃不到这个亏..
    仁者见仁智者见智吧,单纯自己玩的时候会用一下,但是团队合作会避免
    jinue9900
        21
    jinue9900  
       2019-05-08 16:08:31 +08:00
    @thisisgpy 但是要装插件才能实现自动生成 get set 不然一片红。
    其实 lombok 不止 get set 构造器 toString 建筑者模式也很有用 log 也很有用
    thisisgpy
        22
    thisisgpy  
       2019-05-08 16:15:01 +08:00
    @jinue9900 我只是想说,既然 Spring 大佬都推荐了,该用就用。如果项目实际情况不允许,那就不用。
    eternaldzw
        23
    eternaldzw  
       2019-05-08 17:16:13 +08:00
    这个应该是团队大佬决定的事情
    bk201
        24
    bk201  
       2019-05-08 17:21:21 +08:00
    lombok 我记得是有坑在里面的
    nycbdwss
        25
    nycbdwss  
       2019-05-08 17:41:50 +08:00
    新项目用到了 一开始不知道干啥的 但是装了插件以后用的真的狠爽
    th00000
        26
    th00000  
       2019-05-08 17:48:54 +08:00
    我觉得 Lombok 除了简化代码外, 暂时算是 Amber 正式发布前的替代品, 如果能使用 Lombok, 相信 Amber 这么大的福利立刻就会被团队所接受吧。
    smeraldo
        27
    smeraldo  
       2019-05-08 17:54:47 +08:00
    用不用 lombok ?这种 tradeoff 无关紧要,完全可以团队投票决定

    > 使用 Lombok 等于强 X 了你的队友,他们也必须使用,否则代码就编译不通过
    ide 是会报错,但是在 build tools 正确引入的话是可以编译的

    @Sendya #9 @RequiredArgsConstructor 代替普通的 constructor injection,就像 field injection 一样,用上瘾了很容易会产生 code smell
    wc951
        28
    wc951  
       2019-05-08 18:09:09 +08:00 via Android
    @RequiredArgsConstructor 这个注解有点坑爹啊,虽然 @Autowired 可以加上去但是 @Qualifier 没生效,还是不能完全代替手写,而且 onConstructor 里面写注解是实验性的,按官网的说法是之后 jdk 版本的 javac 可能编译出错
    passerbytiny
        29
    passerbytiny  
       2019-05-08 18:19:35 +08:00
    @wc951 #26 啥时候 @RequiredArgsConstructor 回自动加 @Autowired 了,这是 Spring 自动给构造器加 @Autowired,跟 Lombok 无关。Lombok 只负责自动加构造器,别参杂其它的,你要参杂了,不用专职评审给你扣分,有可能维护你代码的人看到了后就要干你。
    palfortime
        30
    palfortime  
       2019-05-08 18:28:50 +08:00 via Android
    我认为那种在 facade 包里用 lombok 的才是 QJ
    hhhsuan
        31
    hhhsuan  
       2019-05-08 18:29:49 +08:00 via Android
    不用,用 kotlin
    wm5d8b
        32
    wm5d8b  
       2019-05-08 19:33:32 +08:00
    为什么队友必须用?就算用记事本也能编译通过
    kevinhwang
        33
    kevinhwang  
       2019-05-08 19:36:05 +08:00 via Android
    个人很反感用这种干预语法糖的插件。如果团队决定要用我建议换语言。反正 Java 慢慢要死掉的。
    luozic
        34
    luozic  
       2019-05-08 19:40:50 +08:00 via iPhone
    代码 少就是正义,少才错误少,要不 ts kotlin 也就不会这么火了
    waising
        35
    waising  
       2019-05-08 19:50:26 +08:00 via iPhone
    @adzchao 你看不懂我回复内容?
    hengyunabc
        36
    hengyunabc  
       2019-05-08 19:51:07 +08:00   1
    spring 本身并不喜欢使用 Lombok,这里有一个去掉 Lombok 的 issue: https://github.com/spring-projects/spring-session/issues/702

    另外在某个 spring 的工程里,明确提到不喜欢用 Lombok,忘记在哪里了。

    在 spring boot 工程里,可以找到一些支持 Lombok 的代码: https://github.com/spring-projects/spring-boot/search?q=Lombok&type=Code

    Lombok 带来的负担要超出大部分人的想像。另外,并不是所有人都会用 IDE 的,强制别人用 IDE 才能正常打开你的代码,非常的不友好。
    lihongjie0209
        37
    lihongjie0209  
       2019-05-08 19:59:17 +08:00
    你能想到的功能 ide 代码生成 和 live template 都有解决方案
    chendy
        38
    chendy  
       2019-05-08 20:14:12 +08:00
    不存在应不应该,毕竟 lombok 没有强大到非用不可,也没有坑到没法用,所以大家肯定各执一词。所以:

    1. 自己的项目,喜欢用就用,不喜欢用就不用
    2. 团队的项目,大家决定用不用,或者老大决定用不用

    没了
    anzhongyu
        39
    anzhongyu  
       2019-05-08 20:20:05 +08:00
    个人觉得 Lombok 不算侵入性很强的,开发还是能带来很大便利
    chendy
        40
    chendy  
       2019-05-08 20:23:56 +08:00   1
    @hengyunabc
    1. spring 团队绝对不讨厌 lombok,starter 里有 lombok 选项,他们自己的项目里也有用 lombok (记得是 data 的一些项目),而且那个 issue 貌似是说方便跑 sample
    2. 因为 lombok 的操作超过了 annotation processor API 的限制,所以其他 annotation processor 项目需要特殊处理它,spring-boot-configuration-processor 是个 annotation-processor,所以需要特殊处理 lombok

    所以其实 lombok 带来的最大的负担是给其他写 annotation processor 的人的,跟普通开发者没啥关系
    rizon
        41
    rizon  
       2019-05-08 20:34:45 +08:00
    @Sendya #9 原来 spring 构造函数注入的方式,不是必须要在构造方法上加 Autowired 的注解啊。。。。被骗了好久。。。。。
    rizon
        42
    rizon  
       2019-05-08 21:10:42 +08:00
    @smeraldo #27 就像 field inject 一样,会产生坏味道?怎么个道理??
    x66/td>
        43
    x66  
       2019-05-08 21:14:50 +08:00
    @rizon #41 从 Spring 4.3 开始不再需要
    WispZhan
        44
    WispZhan  
       2019-05-08 21:19:58 +08:00   1
    这玩意有坑,但是好用。

    不过想用其他 JVM 混编就不要用了,这玩意不是用的 APT ( Annotation Processing Tool ),而是 AST 无法通过简单的调整编译顺序让其他 JVM 语言找到 Lombok 生成的代码。
    micean
        45
    micean  
       2019-05-08 21:30:44 +08:00
    一直用着,在写内部类的时候舒服多了
    Ahaochan
        46
    Ahaochan  
       2019-05-08 21:52:05 +08:00
    一点微小的拙见
    初探 Lombok 并拒绝它 https://blog.ahao.moe/posts/learn_Lombok_and_reject_it.html
    拒绝被强 X,也不强 X 别人 (
    799635347
        47
    799635347  
       2019-05-08 22:24:16 +08:00
    使用过程中除了 @Builder 继承会有些问题,其他表示很 nice
    petercui
        48
    petercui  
       2019-05-08 22:27:56 +08:00
    @Ahaochan gradle 和 maven 都有 lombok 插件的。
    wdlth
        49
    wdlth  
       2019-05-08 22:37:23 +08:00
    Lombok 与 apt 的兼容性有待提高
    smeraldo
        50
    smeraldo  
       2019-05-08 22:37:39 +08:00
    @rizon #42
    众所周知, field injection 很容易弄十几个依赖, 用 constructor 的就会有个很长的参数, 更容易引起注意.
    如果用 lombok, 反而又把这个冗长的构造方法藏起来了, 巧妙地"隐藏"了问题
    orangeD
        51
    orangeD  
       2019-05-08 22:45:08 +08:00 via Android
    用 lombok 一时爽,一直用一直爽。
    Narcissu5
        52
    Narcissu5  
       2019-05-08 22:53:44 +08:00
    lomok 本身就是 java 演进太慢的问题,希望能像前端的各种 slim 一样只是一种暂时的解决方案
    yuekcc
        53
    yuekcc  
       2019-05-09 01:18:09 +08:00
    用过一下。全组人必须得一起用。

    lombok 最大的问题是需要结合 ide 插件使用,虽然 idea 配置不困难,不过组内一些年轻的“老同志”接受不了这风骚的操作。最后只好放弃了。

    果断 kotlin。
    SuperMild
        54
    SuperMild  
       2019-05-09 01:48:07 +08:00
    自从有了 Kotlin ……
    billlee
        55
    billlee  
       2019-05-09 02:23:49 +08:00
    @WispZhan #44 有 maven 插件可以让 lombok 生成 generated-sources, 我写过 lombok 和 scala 混合的代码。不过最近已经全面切换到 scala 了。
    Cbdy
        56
    Cbdy  
       2019-05-09 06:35:32 +08:00 via Android
    看 Spring,Spring 用我们就用
    CasualYours
        57
    CasualYours  
       2019-05-09 09:10:31 +08:00
    我很喜欢用,但确实强 X 了队友。
    dif
        58
    dif  
       2019-05-09 09:12:32 +08:00
    这东西,少数服从多数,不用也影响不大,用了也没啥坏处。反正我们是建议使用的。
    Yuicon
        59
    Yuicon  
       2019-05-09 09:31:39 +08:00
    知道但没用过 感觉并没有提高多少效率 反而容易造成分歧 比如没用过的人就不理解队友的代码了
    shihty5
        60
    shihty5  
       2019-05-09 09:34:37 +08:00
    Hail Kotlin!

    data class MyDataClass(val age: Int, val name:String)
    bduqw
        61
    bduqw  
       2019-05-09 09:43:02 +08:00 via Android
    kotlin data class + 1
    跟 Java 无缝兼容,idea 也自带支持,写爬虫很舒服
    zjengjie
        62
    zjengjie  
       2019-05-09 10:03:54 +08:00
    @Ahaochan 你那文章写得挺没道理的。
    1.编译成 jar 包后引入是不需要依赖 lombok 的,引入源码包才需要。
    2.你把那个 setter 方法写在类里面会自动覆盖 lombok 生成的 setter,完全不会对功能造成影响。
    tppppp
        63
    tppppp  
       2019-05-09 10:42:12 +08:00
    lombok 遇到过坑 版本太新会 require jdk9+
    thinkloki
        64
    thinkloki  
       2019-05-09 10:47:16 +08:00
    @SuperMild 意思是写 bean 的时候用 kotlin 吗?还是整个服务用 kotlin 来写?
    rizon
        65
    rizon  
       2019-05-09 11:10:53 +08:00
    @smeraldo #50 好的吧,但是依赖一大堆 这种是业务场景啊,也没啥解决办法吧?
    rizon
        66
    rizon  
       2019-05-09 11:12:29 +08:00
    @SuperMild @thinkloki #64
    我也挺好奇的,有没有混着 kotlin 写 java 的?我记得以前看到过一些示例来着,忘了在哪了。如果有相关的示例可以看看就好了。
    CuChulainn
        67
    CuChulainn  
       2019-05-09 11:19:27 +08:00
    kotlin data class 了解一下
    notreami
        68
    notreami  
       2019-05-09 12:36:06 +08:00
    这时候就突然觉得,java 生态开始分裂了。
    大家盯着 lombok 肉体强 X,而忽略了 kotlin、scala 这些携生态的方式对 java 的肉体和思想的双重羞辱嘛?
    mreasonyang
        69
    mreasonyang  
       2019-05-09 13:42:41 +08:00 via iPhone
    实际使用中,个人感觉 lombok 最麻烦的就是很难处理在 maven 项目中和 aspectj 共存的问题
    EastLord
        70
    EastLord  
       2019-05-09 13:56:19 +08:00
    现在 ide 能够自动生成 get/set 方法 我觉得没必要用
    SaintDan
        71
    SaintDan  
       2019-05-09 16:00:22 +08:00
    如果团队能协商使用的话,当然用了更好
    主要是 lombok 不仅仅是 get / set 还有很多便捷的功能
    leonard916
        72
    leonard916  
       2019-05-09 17:42:34 +08:00
    我人是很喜 lombok 的 至於 X 友 我不心
    反正不想省事
    vela
        73
    vela  
       2019-05-09 17:50:50 +08:00
    lombok 在解决 Java 语言冗余方面做的很好,但是不够彻底。比较起来,我会倾向:
    使用 Kotlin 或者混合使用 Kotlin 来解决语言层面冗余的问题。

    lombok 目前实现也有一些 trick 和 hack,如果有更好的实现也许我会给 lombok 加分。另外 lombok 带来的一些隐性的成本是一般开发者用脚投票时不太容易看到的(毕竟短时间看省事儿好用了),团队决策者是需要考虑这些的。我个人的看法是,观望并等待更好的解决方案,或者等待 lombok 更加成熟一些再进行推广(但是现阶段我不会在团队中严格禁止)。

    至于大家提到的 IDE 配置问题,我觉得完全不是一个问题和障碍,Java 目前已经是重度依赖 IDE 的语言了,这点儿配置成本如果都无法接受,听起来很滑稽。
    cubecube
        74
    cubecube  
       2019-05-09 20:37:19 +08:00 via Android
    如果新团队可以引入,既有项目的话,没太大必要,除了让你自己觉得这很爽只在,潜在收益不太大
    yuankui
        75
    yuankui  
       2019-05-09 20:46:04 +08:00
    其实就是 Java 没做好,lombok 擦了屁股而已。

    那些拉了屎不擦屁股的,难道不难受吗?
    atonku
        76
    atonku  
       2019-05-10 08:57:28 +08:00
    所以我们都在摸鱼
    cmower
        77
    cmower  
    OP
       2019-05-10 10:48:57 +08:00
    @asdf17128
    @waising
    @boywang004
    @SaintDan
    @CuChulainn
    @bduqw
    @shihty5
    @CasualYours
    @SuperMild
    @yuekcc
    @anzhongyu
    @EmdeBoas
    @Le4fun

    看来褒贬不一,不过 kotlin 好像都很喜欢。
    cmower
        78
    cmower  
    OP
       2019-05-10 10:49:32 +08:00
    linvaux
        79
    linvaux  
       2019-05-21 08:26:10 +08:00 via Android
    无所谓,爱用不用,不用就去手写,屁大点事儿也要讨论半天。
    nkduqi
        80
    nkduqi  
       2019-05-21 13:26:09 +08:00
    基本上会用,但是要注意其中的一些坑,别让团队踩上了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2744 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 99ms UTC 09:09 PVG 17:09 LAX 02:09 JFK 05:09
    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