有效Java中的构建器模式
我最近开始阅读Joshua Bloch撰写的Effective Java。我发现Builder模式的概念[书中的第2项]非常有趣。我试图在我的项目中实现它,但有编译错误。以下是我试图做的事情:
具有多个属性及其构建器类的类:
public class NutritionalFacts {
private int sodium;
private int fat;
private int carbo;
public class Builder {
private int sodium;
private int fat;
private int carbo;
public Builder(int s) {
this.sodium = s;
}
public Builder fat(int f) {
this.fat = f;
return this;
}
public Builder carbo(int c) {
this.carbo = c;
return this;
}
public NutritionalFacts build() {
return new NutritionalFacts(this);
}
}
private NutritionalFacts(Builder b) {
this.sodium = b.sodium;
this.fat = b.fat;
this.carbo = b.carbo;
}
}
我尝试使用上述类的类:
public class Main {
public static void main(String args[]) {
NutritionalFacts n =
new NutritionalFacts.Builder(10).carbo(23).fat(1).build();
}
}
我收到以下编译器错误:
包含的封闭实例
effectivejava.BuilderPattern.NutritionalFacts.Builder
是必须的
NutritionalFacts n = new
NutritionalFacts.Builder(10).carbo(23).fat(1).build();
我不明白这个消息是什么意思。请解释。上面的代码类似于Bloch在他的书中提出的例子。
没有找到相关结果
已邀请:
9 个回复
骨酚柯
类。然后它会工作。如果它是非静态的,那么它将需要一个拥有它的实例 - 并且要点不是拥有它的实例,甚至禁止在没有构建器的情况下创建实例。
参考:嵌套类
慰泥悍瓶
现在您可以按如下方式设置属性:
疾桓
恋卡
改为
,它应该有效。 您提供的示例用法失败,因为没有
的实例。始终实例化用于所有实际目的的静态类。如果你不使它静止,你需要说:
因为你每次都需要建造一个新的
。
芭隘的盘石
内部类声明为
。 请参阅非静态内部类和静态内部类的一些文档。 基本上,如果没有附加的外部类实例,非静态内部类实例就不可能存在。
辅奈
抢垢洛韧
嵌套类
妊辽剁茧
更方便。
允许您使用以下代码自动生成使您的类可实例化所需的代码:
官方文档:https://www.projectlombok.org/features/Builder
寇剩
。
所以,您可以像这样使用您的构建器: