Lombok @SuperBuilder 不带参数
Lombok @SuperBuilder doesn't take parameters
假设两个简单的类:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Party {
protected Long id;
protected String status;
}
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Person extends Party {
private String name;
private Long sex;
}
编译因以下错误而失败。阅读后 Lombok | @SuperBuilder 我不知道我会错过什么。
C:\Dev\companyproject\src\main\java\com\companyproject\entity\Person.java:12
java: type com.companyproject.entity.Party.PartyBuilder does not take parameters
这里的问题是父 class 上的 @Builder
注释不正确。 documentation for @SuperBuilder
提到:
Most importantly, it requires that all superclasses also have the @SuperBuilder
annotation.
所以正确的父 class 应该是:
@Data
@SuperBuilder // <- annotation replaced here
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Party {
protected Long id;
protected String status;
}
附录:
两个注释之间的一个主要区别是 @SuperBuilder
还创建了 class 的构造函数,期望有相应的构建器参数。
对于 Party
它看起来像:
protected Party(PartyBuilder<?, ?> b) {
this.id = b.id;
this.status = b.status;
}
和 Person
:
protected Person(PersonBuilder<?, ?> b) {
super(b);
this.name = b.name;
this.sex = b.sex;
}
如您所见,子 class 构造函数希望将其自己的构建器传递给父 class 构造函数,这只有在存在匹配的构造函数时才有可能,并且 @Builder
不会生成它。
另外 PersonBuilder<>
扩展了 PartyBuilder<>
,这就是为什么调用 super
和子类型构建器在这里工作正常。
假设两个简单的类:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Party {
protected Long id;
protected String status;
}
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Person extends Party {
private String name;
private Long sex;
}
编译因以下错误而失败。阅读后 Lombok | @SuperBuilder 我不知道我会错过什么。
C:\Dev\companyproject\src\main\java\com\companyproject\entity\Person.java:12 java: type com.companyproject.entity.Party.PartyBuilder does not take parameters
这里的问题是父 class 上的 @Builder
注释不正确。 documentation for @SuperBuilder
提到:
Most importantly, it requires that all superclasses also have the
@SuperBuilder
annotation.
所以正确的父 class 应该是:
@Data
@SuperBuilder // <- annotation replaced here
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Party {
protected Long id;
protected String status;
}
附录:
两个注释之间的一个主要区别是 @SuperBuilder
还创建了 class 的构造函数,期望有相应的构建器参数。
对于 Party
它看起来像:
protected Party(PartyBuilder<?, ?> b) {
this.id = b.id;
this.status = b.status;
}
和 Person
:
protected Person(PersonBuilder<?, ?> b) {
super(b);
this.name = b.name;
this.sex = b.sex;
}
如您所见,子 class 构造函数希望将其自己的构建器传递给父 class 构造函数,这只有在存在匹配的构造函数时才有可能,并且 @Builder
不会生成它。
另外 PersonBuilder<>
扩展了 PartyBuilder<>
,这就是为什么调用 super
和子类型构建器在这里工作正常。