在IntelliJ上解决Lombok @SuperBuilder问题

18

我有一个名为Product的类:

   @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()方法标记为错误。

我看到这个问题已经被提出,我想知道是否有方法可以解决我的代码问题。


2
代码在我的电脑上编译并运行正常。这只是IntelliJ中的一个虚假“错误”,您可以忽略它,直到最终插件版本发布。截至2019年9月1日,alpha版本已发布https://github.com/mplushnikov/lombok-intellij-plugin/releases/tag/0.27_superbuilder_alpha - biniam
7
@SuperBuilder 支持已经纳入 IntelliJ Lombok 插件的 0.27 版本发布。 - Jan Rieke
3个回答

6

不,直到问题得到解决为止。

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

有一些“欺骗”的方法,但都是hack - 例如,你可以将(super)builder类编译成自己的jar文件,然后将该jar文件导入到项目中。由于你已经编译了SuperBuilder类,它们现在包含所有生成的方法,因此IDE将看到实际的方法,并且如果你尝试使用它们,它们就会被推荐。功能上可行,但并不非常有用...如果你需要更新SuperBuilder注释的类,你现在必须每次都编译才能看到更改。显然,你可以创建构建任务来为你执行此操作,但你总是在绕过实际问题,即插件支持。


4
这种解决方法对我有效:
@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();

2

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接