【问题标题】:How to tell to lombok the generated getter is an @Override如何告诉 lombok 生成的 getter 是 @Override
【发布时间】:2020-12-29 01:37:33
【问题描述】:

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

public interface MyInterface{

    Object getA()
}

还有一个班级

@Getter
public class MyClass implements MyInterface{

      private Object a;

      private Object b

}

而且我检查了生成的类,类中生成的方法不是@Override

我想知道如何添加此注释?以及缺少@Override 的后果是什么?

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

我已经看过关于sonarqube + lombok = false positives的话题

但在我的情况下, b 不会产生误报。所以我认为这没有直接关系

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

【问题讨论】:

  • 只是好奇,你为什么需要它?
  • 我有很多类都有一个名为 code 的字段。他们目前在这个班级之间没有共同的遗产(我们不想这样做)。对于检测该类型实体列表中的更改的实用程序类,我们创建了一个定义 getCode 的通用接口。
  • 我们想在一个类中使用它,以避免每次都实现每个getter
  • 这是一个有用的问题,因为我已将 Error Prone 添加到我的项目中,并且它被配置为将覆盖和不 @Override 的函数标记为构建错误。

标签: java sonarqube overriding lombok


【解决方案1】:

您可以使用注解的onMethod attribute 为生成的方法添加您想要的任何注解。

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

在这种情况下,作为一种风格问题,我可能会将类级别的@Getter 移动到另一个字段。如果有cde 都应该使用正常(无注释)@Getter 逻辑,我会保持如上。

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

您可能还想enable Lombok's generated annotations。它将阻止一些工具(覆盖、静态分析等)检查 Lombok 的方法。不确定它在这种情况下是否有帮助,但我几乎在所有项目中都启用了它。

lombok.addLombokGeneratedAnnotation = true

【讨论】:

    【解决方案2】:

    您可以使用@GetteronMethod@Override 添加到特定字段。

    例如

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

    @Overrideno affect on the code itself。它只是通知编译器该方法正在覆盖其超类中的方法。如果方法没有覆盖超类中的方法,编译器将无法构建。

    【讨论】:

    • 这是一个我没有想到的好点。反正我个人是不会这么做的。注释主要有助于防止用户错误而不是生成的代码。老实说,如果我要做这样的事情,我会明确声明 getter/setter 和 Override 注释,以使其他开发人员更清楚这是覆盖超类。
    • 通过 lombok 添加注释仍然可以防止一些用户错误 - 它检查该方法是否存在接口。如果将来更改类以删除接口,则构建失败将使进行更改的开发人员有时间思考“我真的需要这个字段和方法吗?”如果没有构建失败,它们可能会意外地留在里面。但我可能也不会添加它,主要是因为语法很难看,我会照你说的做。当然,所有这一切都取决于它实际工作的方式,你可能乐观地认为它应该是这样的
    • 如果你很好奇,我刚刚做了一个测试项目,以这种方式添加@Override 确实可以按照你想要/希望的方式工作
    【解决方案3】:

    防止由Error Prone(或类似工具)误报缺少@Override 的更通用方法是配置Lombok 以使用@lombok.Generated 注释其生成的代码。这可以通过在 Lombok 的 lombok.config 中添加以下条目来全局完成:

    lombok.addLombokGeneratedAnnotation = true
    

    请注意,这不是一个通用的解决方案 - 相关工具需要尊重 @lombol.Generated(或更好,任何 @*.Generated)注释。

    JacocoError Prone(最近)等工具已经支持它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多