如何告诉lombok生成的getter是一个@Override

问题描述 投票:0回答:4

我在我的项目中使用lombok,并且我有一个界面:

public interface MyInterface{

    Object getA()
}

还有一堂课

@Getter
public class MyClass implements MyInterface{

      private Object a;

      private Object b

}

我检查了生成的类,类中生成的方法不是

@Override

我想知道如何添加这个注释?缺失

@Override
会产生什么后果?

这可能是另一个问题,但此代码由声纳库分析,声纳说私有字段 a 从未使用过。

我已经看过关于 sonarqube + lombok = 误报的主题

但就我而言,b 不会产生误报。所以我认为这没有直接关系

您是否找到了无需重新实现 getA() 即可避免此问题的解决方案?

java sonarqube overriding lombok
4个回答
7
投票

您可以使用注释的

onMethod
属性向生成的方法添加任何您想要的注释。

@Getter
public class MyClass implements MyInterface{
    @Getter(onMethod = @__(@Override))
    private Object a;
    private Object b
}

在这种情况下,出于风格问题,我可能会将班级级别

@Getter
移至其他字段。如果有
c
d
e
都应该使用正常(无注释)@Getter 逻辑,我会将其保留为上面的样子。

public class MyClass implements MyInterface{
    @Getter(onMethod = @__(@Override))
    private Object a;
    @Getter
    private Object b
}

您可能还想启用 Lombok 生成的注释。它将防止某些工具(覆盖率、静态分析等)费心检查 Lombok 的方法。不确定它在这种情况下是否有帮助,但我几乎在我的所有项目中都启用了它。

lombok.addLombokGeneratedAnnotation = true

3
投票

您可以使用

@Override
@Getter
onMethod
添加到特定字段。

例如

@Getter(onMethod = @__(@Override))
private Object a;

@Override
对代码本身没有影响。它只是通知编译器该方法正在重写其超类中的方法。如果该方法没有重写超类中的方法,编译器将使构建失败。


2
投票

防止通过 Error Prone (或类似工具)误报缺少 @Override 的更通用方法是配置 Lombok 以使用

@lombok.Generated
注释其生成的代码。这可以通过将以下条目添加到 Lombok 的
lombok.config
来全局完成:

lombok.addLombokGeneratedAnnotation = true

请注意,这不是通用解决方案 - 相关工具需要尊重

@lombol.Generated
(或者更好,任何
@*.Generated
)注释。

Jacoco
Error Prone
(最近)这样的工具已经支持它。


0
投票

抱歉,官方文档这么说

如果已存在同名方法,则不会生成任何方法 (不区分大小写)和相同的参数计数。 ...这个警告的存在是为了 防止混乱。如果为此跳过方法的生成 原因,而是发出警告。

所以与

getB()
不同,
getA()
方法不是由
getter
lombok注释生成的私有字段的
@Getter
方法(它可能只是一个返回
noop
而不是字段
Null
private Object a
) ),因此字段
private Object a
将永远无法访问,因为
getA()
不是
getter
方法,因此
sonarqube
警报出现在
private
字段
a
上,而不出现在
b
上。简而言之,这是不可能的。如果已经存在具有相同名称(不区分大小写)和相同参数计数的
getter
setter
或任何方法,Lombok 不会生成它,因此您必须重命名私有字段“a”或 MyInterface 方法“getA” ()" 以获得预期的结果。

© www.soinside.com 2019 - 2024. All rights reserved.