【发布时间】:2021-04-01 05:14:37
【问题描述】:
从 jOOQ 3.14 开始,当使用 jOOQ 的代码如下:
DSL.val(1);
我喜欢将上面的表达式分配给一个局部变量,所以我使用了 Eclipse IDE 快速修复操作“Assign statement to new local variable”,它添加了这个导入:
import org.jetbrains.annotations.NotNull;
并生成以下代码:
@NotNull
Param<Integer> val = DSL.val(1);
IntelliJ 不会发生这种情况,它的 “引入局部变量” 快速修复会生成所需的代码:
Param<Integer> val = DSL.val(1);
如何防止不必要地插入@NotNull 注释?
【问题讨论】:
-
根本原因是 jOOQ 包含来自 JetBrains 的空注释以支持非供应商中立的编程语言 Kotlin,并且这些空注释存储在字节码中,这在技术上不是必需的(并且不在符合 Java 语言规范),但这种 hack 让 JetBrains 更容易实现他们的工具。运行使用 jOOQ 的应用程序时,JetBrains 空注解无故占用内存。
-
@howlger:是的,这就是根本原因。许多库已经开始使用这些注释,它们可能存在您提到的缺陷,但这不是重点。这个问题是关于 Eclipse 快速修复行为的。
-
公平地说,您问 “如何防止这种情况发生?” 可以通过在 jOOQ 的字节码中没有空注释或至少没有 @987654326 来防止它@ 方法的注解。也许已经有一种方法(或 JetBrains 正在研究它)提供 Kotlin 支持而无需在字节码中添加注释,因为它们在运行时无用。或者 jOOQ(你的作者)可以通过额外的 API/JAR 提供 Kotlin 支持。 “待处理的错误” 是您几个月前报告的一项增强功能,目前似乎没有人在研究您提出的“解决方案”。
-
“公平地说,你问了” - 假装别人问了这个问题。我经常使用 SO 作为外部常见问题解答,这是 SO 鼓励的。 “jOOQ 可以通过 [...] 提供 Kotlin 支持” - 这是一个非常容易实现且方便的结果。对于 kotlin 可空性支持,我认为没有比使用此类注释更好的解决方案了。 jOOQ 没有退路。 “目前似乎没有人在工作” - 当然,不用担心。此处的此问答旨在帮助人们了解正在发生的事情,并更好地找到解决方法。我被问过几次这个问题。
-
那些考虑为他们的框架也提供 Kotlin 支持的人应该知道,这意味着注释将被添加到他们的类文件中,因为 JetBrains 使用了一个肮脏的技巧。所以他们可能会要求 JetBrains 解决这个问题。在 Eclipse 中,很少使用的
TYPE_USE注释有一个特殊的行为,这是有意义的(在这一点上我们不同意)。但是,Eclipse 可以通过默认理解广泛使用的空注释来做得更好,这将导致此处的行为不同并更好地检测问题。