【问题标题】:Lombok @SuperBuilder workaround on IntelliJIntelliJ 上的 Lombok @SuperBuilder 解决方法
【发布时间】:2019-09-14 07:25:19
【问题描述】:

我有一个班级产品:

   @Data
   @SuperBuilder
   public class Product {

        private String name;
        private String manufacturer;

   }

还有一个扩展类

@Data
@SuperBuilder
public class Frame extends Product{

   private String model;

}

我正在尝试使用构建器创建一个 Frame 对象:

 return Frame.builder() 
        .name("Frame ABC")
        .manufacturer("Manufacturer")
        .model("Model 1")
        .build();

我正在使用带有 Lombok 插件的 IntelliJ 2019.1.1,但不幸的是,编译器将 .name().manufacturer() 方法标记为错误。 我看到 this issue 打开了,我想知道是否有解决方法可以让我的代码正常工作。

【问题讨论】:

  • 代码为我编译和运行。这只是 IntelliJ 中的一个错误“错误”,您可以忽略它,直到最终插件版本发布。截至 2019 年 9 月 1 日,alpha 版本发布github.com/mplushnikov/lombok-intellij-plugin/releases/tag/…
  • @SuperBuilder 支持已使其发布了 IntelliJ Lombok 插件的 0.27。

标签: java lombok intellij-lombok-plugin


【解决方案1】:

不,直到问题得到解决。

这是先有鸡还是先有蛋的问题。在编译带有 @SuperBuilder 注释的类之前,实际生成的构建器方法不存在。该插件(一旦更新/修复)与 IDE 一起使用这些方法,因此即使它们尚不存在,该插件也会告诉 IDE 在编译发生时它们将是什么。

有很多方法可以“作弊”,但它们都是 hack - 例如,您可以在自己的 jar 中编译(超级)构建器类,然后将该 jar 导入到您的项目中。当您编译 SuperBuilder 类时,它们现在包含所有生成的方法,因此 IDE 将看到实际的方法,并因此在您尝试使用它们时提出它们。功能性但不是很有用...如果您需要更新 SuperBuilder 注释类,您现在必须每次在更改可见之前编译它们。显然,您可以创建构建任务来为您执行此操作,但您始终在解决插件支持的实际问题。

【讨论】:

    【解决方案2】:

    这个解决方法对我有用:

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Product {
    
      private String name;
      private String manufacturer;
    
    }
    
    @Data
    @NoArgsConstructor
    public class Frame extends Product{
    
       private String model;
    
       @Builder
       public Frame(String name, String manufacturer, String model){
          super(name, manufacturer);
          this.model = model;
       }
    
    }
    

    我看到的唯一问题是,当你在类中有很多字段时,编写这样的构造函数会变得很烦人,但我仍然认为这是值得的,因为最后你可以访问父字段和子字段。

     return Frame.builder()
        
            .name("Frame ABC")
        
            .manufacturer("Manufacturer")
        
            .model("Model 1")
        
            .build();
    

    【讨论】:

      【解决方案3】:

      先构建子成员字段,然后构建父成员字段,类型转换似乎对我有用:

      return (Frame) Frame.builder()
                          .model("Model 1")
                          .name("Frame ABC")  
                          .manufacturer("Manufacturer")    
                          .build();
      

      【讨论】:

        猜你喜欢
        • 2020-07-18
        • 2018-05-28
        • 2019-06-09
        • 1970-01-01
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        • 2020-08-22
        • 1970-01-01
        相关资源
        最近更新 更多