IntelliJ上的Lombok @SuperBuilder解决方法

时间:2019-04-24 22:41:02

标签: java lombok intellij-lombok-plugin

我上课了:

   @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与lombok插件一起使用,但不幸的是,编译器将.name()和.manufacturer()方法标记为错误。 我看到这个https://github.com/mplushnikov/lombok-intellij-plugin/issues/513问题已经打开,我想知道是否有解决方法可以使我的代码正常工作。

3 个答案:

答案 0 :(得分:2)

否,直到问题解决。

这是鸡和鸡蛋的问题。在编译带有@SuperBuilder批注的类之前,实际生成的生成器方法不存在。用于这些方法的插件(一旦更新/修复)可与IDE一起使用,因此即使它们尚不存在,该插件也会告诉IDE在进行编译时的状态。

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

答案 1 :(得分:1)

此替代方法对我有用:

std::unique_ptr

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

@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;
   }

}

答案 2 :(得分:1)

首先使用子成员字段构建,然后使用类型强制转换的父成员字段构建对我来说很有效:

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