我上课了:
@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问题已经打开,我想知道是否有解决方法可以使我的代码正常工作。
答案 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();