龙目岛@SuperBuilder在IntelliJ上的变通办法

2022-09-03 02:39:33

我有一个类产品:

   @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();

我正在使用IntelliJ 2019.1.1和龙目岛插件,但不幸的是,编译器将和方法标记为错误。我看到这个问题打开了,我想知道是否有解决方法使我的代码正常工作。.name().manufacturer()


答案 1

不会,直到问题得到解决。

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

有一些方法可以“作弊”,但它们都是黑客 - 例如,您可以在自己的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();

推荐