我为一个类制作了一个功能构建器,其工作方式如下
new ComponentStatus.Builder()
.with($ -> {
$.name = element.getName();
$.state = element.getState();
$.status = element.getStatus();
$.description = element.getStatusDescription();
}).build();
班级是
public class ComponentStatus {
private final String name;
private final int state;
private final int status;
private final String description;
ComponentStatus(String name, int state, int status, String description) {
this.name = name;
this.state = state;
this.status = status;
this.description = description;
}
public static class Builder {
public String name;
public int state;
public int status;
public String description;
Builder with(
Consumer<Builder> builderFunction) {
builderFunction.accept(this);
return this;
}
ComponentStatus build() {
return new ComponentStatus(name, state, status, description);
}
}
}
它有效。现在我想向其他类添加一个构建器。
with()
方法总是相同的,所以我尝试制作一个界面来保存样板
public interface Buildable {
default Buildable with(
Consumer<Buildable> builderFunction) {
builderFunction.accept(this);
return this;
}
Object build();
}
这不起作用,因为
with()
返回 Buildable
而不是 <? extends Buildable>
,但更改返回类型也不起作用。该怎么办?
要解决这个问题,您可以使用带有自引用类型参数的泛型。
以下是定义
Buildable
界面的方法:
import java.util.function.Consumer;
public interface Buildable<T extends Buildable<T>> {
default T with(Consumer<T> builderFunction) {
builderFunction.accept((T) this);
return (T) this;
}
Object build();
}
现在更新您的
ComponentStatus.Builder
类以实现 Buildable
:
public static class Builder implements Buildable<Builder> {
public String name;
public int state;
public int status;
public String description;
@Override
public ComponentStatus build() {
return new ComponentStatus(name, state, status, description);
}
}
这样,
with
方法将返回正确的构建器类型,从而允许方法链接。