龙目岛@SuperBuilder IntelliJ 上的解决方法



我有一个类产品:

@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()方法标记为错误。 我看到这个问题打开了,我想知道是否有解决方法可以使我的代码正常工作。

不,直到问题得到解决。

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

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

此解决方法对我有用:

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

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

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

最新更新