【问题标题】:What are the risks with Project Lombok?龙目岛项目有哪些风险?
【发布时间】:2011-01-03 22:55:06
【问题描述】:

我正在为新的一年提出性能目标,并且我认为设定一个减少代码库大小的目标会很有趣,尤其是样板代码。我想出的解决这个问题的一个方法是使用Project Lombok 使bean 尽可能短。但是我习惯于忽略新软件和方法的缺点,所以我依赖于 Stack Overflow 社区:谁能告诉我为什么 Lombok 是个坏主意?

【问题讨论】:

标签: java jakarta-ee boilerplate lombok


【解决方案1】:

Lombok 的一个限制是它与 java 编译器密切相关。由于注解处理器 API 只允许在编译期间创建新文件(而不是修改现有文件),lombok 使用该 API 作为修改 java 编译器的入口点。不幸的是,编译器的这些修改大量使用了非公共 API。使用 lombok 可能是个好主意,但您必须意识到升级编译器可能会破坏您的代码。概率很低,但我总是觉得使用非公共 API 很不舒服。

【讨论】:

  • 非常好。 Java 8 + Lombok 的历史告诉我们这可能是一个问题。
  • 目前,他们修复了它,它适用于 Java 9,但不适用于 Java 10。
【解决方案2】:

在我看来,“Java+Lombok”中的源代码不再是 Java 源代码。我认为这与 Borland 公司多年前在他们的 Borland C++ Builder IDE for VCL 中所做的类似——他们在 C++ 代码中引入了“属性”,有效地引入了某种不再是 C++ 的新编程语言(不是 C++ 意义上的C++ 语言标准)。使用“Java+Lombok”的源不是 Java 语言规范意义上的有效源。此外,我认为注释并非旨在影响语言语义。

【讨论】:

  • 我比接受的答案更同意这个答案。 Lombok 不再限制 IDE 的使用。它只是将 Java 带入了现代。如果没有 Lombok,我会要求我的公司将代码库更改为不那么冗长的东西,比如 Kotlin。
【解决方案3】:

一个主要的缺点是 IDE 支持。由于 Lombok 实际上并不是一种语言更改,而且您的 IDE 只支持 java,因此您需要一个支持 Lombok 的 IDE 才能正常工作。到目前为止,只有 Eclipse 包含 Eclipse 和 IntelliJ。如果您使用 eclipse 可能没问题,但请记住,您也在为未来的开发人员做出决定。

我建议您考虑将您的一些代码转移到一种不太正式的语言中,例如 groovy。我们已经成功地将我们的一些业务逻辑和模型转移到了 groovy 中,并且运行起来非常顺利。

【讨论】:

  • 关于 Eclipse 的错误:我在 Netbeans Dev 中使用 Project Lombok 就好了。而且我认为他们也支持其他 IDE
  • 情况可能正在改善,但仍然存在批评,即您需要明确的 IDE 支持才能将 IDE 用于 Lombok 项目。您的项目不再符合严格的 Java 代码。
  • 如果有什么安慰的话,我使用 Eclipse,但其他一些开发人员使用 IDEA,它似乎还不支持 Lombok。
  • 这个答案已经过时了。 IntelliJ(通过插件)和 NetBeans 都支持 Lombok。
  • 更新 2021 最新版本的 Intellij Idea 从 2020.3 开始支持开箱即用的 lombok。我不再觉得 IDE 有问题了。只要团队中的每个人都同意使用 Lombok,它只会有助于加快开发时间,或者如果团队中的每个人都按照自己的意愿行事并且没有就“团队标准”应该是什么达成共识
【解决方案4】:

像 Lombok 这样的东西的一个潜在缺点是,由于“缺少”setter/getter,源工具可能无法“识别”结果对象中赋予其“bean”品质的方面,因为这些品质只在编译的类中体现.

另一个缺点是它是工具链中的又一个“黑魔法”。幸运的是,它似乎是一个相当良性的部分(我没有使用它),它发生在编译时而不是运行时的事实实际上是一种祝福(恕我直言)。但是,如果没有项目,您将无法重用或共享您的代码,因为它会将工件添加到您的代码库中。因此,虽然编译后的类文件可能是“POJO”,但我认为您的源代码不是 POJO。

这些都不是严重的缺点,而只是需要注意的方面。

【讨论】:

  • 您可以使用projectlombok.org/features/delombok.html 来获得香草课程。
  • 我完全同意“黑魔法”这个术语。如果您熟悉它,那么您就会知道发生了什么,但如果您是新手,那么您的代码似乎在欺骗您,这是 WTF 时刻的潜在来源
【解决方案5】:

这是一个第三方库,有些开发者不太了解。

IDE 应该支持注解处理(IDEA 和 Eclipse 都有插件)。

如上所述,您的代码将没有 getter/setter。它会导致声纳/检查样式违规。

【讨论】:

  • 已经有记录的方法解决这个问题 - 在运行声纳/checkstyle 之前使用 delombok。但不管怎样,你真的想对你的 POJO 进行代码覆盖吗?!
  • 这与 POJO 覆盖率无关。声纳说像make this field private and add getter
【解决方案6】:

在我看来,Project Lombok 最明显的风险是,当您决定使用 lombok 时,您还决定处理您的代码的其他所有人都使用 lombok。这是对所有库的正确陈述,但 Lombok 的特殊之处在于它是构建时依赖项,并且您的 IDE 需要插件来弄清楚发生了什么。这意味着任何有理由接触您的代码的人。有人试图调试奇怪的行为等)需要知道如何设置它以及它是如何工作的。这可能有点令人沮丧。

【讨论】:

  • 非常如此。这尤其适用于人们可能来自不同编程背景的情况,即非 JVM 语言,而 Lombok 则鲜为人知。
【解决方案7】:

正如用户@Jcs 在另一个答案中指出的那样,我想补充更多。

在我们的项目中,我们使用 mapstruct 来生成映射器类,在编译代码之前,使用 mvn generate-sources 命令,这是在进程阶段使用 maven 处理器插件完成的。

project lombok 在编译阶段在类文件中添加 getter/setter 的字节码。

由于在编译之前执行了process阶段,所以发现类中没有getter/setter。

有一些变通方法可用于执行多个编译阶段。 有关详细信息,请参阅此git hub ticket

注意:我使用的是 Spring 的 STS ide,lombok 支持它:)

【讨论】:

    【解决方案8】:

    添加到其他响应中。

    不使用它的主要原因是在 Java 14 中作为实验性功能添加了一个新的 record 关键字。Java 16 将 records 带出预览版,这将使 Lombok 项目在大多数情况下过时。

    由于 Java 14 能够编写:

    record Book(String title, String author, String isbn);
    

    无需任何注释即可自动访问构造函数、getter/setter、hashCode、equals 和 toString 方法。

    【讨论】:

      猜你喜欢
      • 2016-10-08
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 2021-03-27
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多