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

Lombok 到底应不应该使用?

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

    之前写了一篇《干啥呢,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 最好还是要知道生成的到底是些什么代码比较好
    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
        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 隊友 我並不關心
    反正誰不想省事
    boywang004
        73
    boywang004  
       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   ·   实用小工具   ·   1178 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 23:06 · PVG 07:06 · LAX 15:06 · JFK 18:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.