如何抑制龙目岛警告

Posted

技术标签:

【中文标题】如何抑制龙目岛警告【英文标题】:How to suppress lombok warnings 【发布时间】:2018-02-13 21:22:24 【问题描述】:

我有一个实体

@Builder
class MyEntity 
   private Set<OtherEntitiy> children = new HashSet<>()

我收到了龙目岛警告。

警告:@Builder 将完全忽略初始化表达式。如果您希望初始化表达式用作默认值,请添加 @Builder.Default。如果在构建期间它不应该是可设置的,则将字段设置为最终字段。 Set = new HashSet();

问题是:如何抑制 lombok 的警告?

还有。我需要初始化孩子,因为我想避免 NullPointerException。我也不能将此文件标记为最终文件,因为它真的不是最终文件。我不能标记归档@Builder.Default,因为我不仅想使用构建器创建这个实体,而且我想为其他构造器保存默认值。

【问题讨论】:

我认为 Lombok 试图告诉您它总是会覆盖该值。 github.com/rzwitserloot/lombok/issues/916 我不太了解 Lombok,但解决方法可能是使用 @Builder 而不是类来定位构造函数。 我认为该警告是不言自明的,您应该考虑按照消息中的建议修复警告,而不是试图压制它。 @dpr 你是对的。首先我们需要考虑如何解决这个问题。但在这种情况下,建议的决定是不可接受的。我在上面的问题中已经解释过了。 只是一些想法:1.您可以添加@AllArgsConstructor(access=AccessLevel.PRIVATE)并删除初始化。 Builder 将进行初始化,您不会称您为私有 ctor。 +++ 2. 你也许可以使用@Singular。 +++ 3. 该字段可能应该是最终的,因为您可以通过修改集合而不是替换它来完成所有操作。 【参考方案1】:

使用@Builder.Default为您的Builder添加默认行为

@Builder
class MyEntity 
   @Builder.Default
   private Set<String> children = new HashSet<>();

您在定义了默认值的字段上使用它,Lombok 然后将在对象创建期间获取该值@Builder.Default 功能已添加到 lombok v1.16.16. 因此,如果您使用的是较低版本的Lombok,您将无法使用它。

【讨论】:

当 OP 说“我不能标记归档 @Builder.Default 因为...”时,这怎么可能是公认的答案? 在 v1.16.16 中有一个已知问题/错误。这是链接:github.com/rzwitserloot/lombok/issues/1347。这个注释从字段声明中删除了默认初始化,如果你有它,它会破坏无参数构造函数,因为使用它不会再初始化字段。 关于使用 Builder.Default 的潜在问题的附加信息:***.com/questions/47883931/… @tomosius 而且它还是坏了。如果需要任何其他构造函数(例如用于 JSON 反序列化),则 Builder.Default 将不可用。

以上是关于如何抑制龙目岛警告的主要内容,如果未能解决你的问题,请参考以下文章

如何抑制 LLVM 自动合成警告?

如何在 Kotlin 中抑制检查式警告

如何抑制蜂巢警告

如何抑制更新链接警告?

如何使用 Intellij SonarLint 插件抑制特定方法的警告

如何抑制源自宏的 Clippy 警告?