Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有效的Java:Builder模式_Java_Builder_Factory Pattern_Effective Java - Fatal编程技术网

有效的Java:Builder模式

有效的Java:Builder模式,java,builder,factory-pattern,effective-java,Java,Builder,Factory Pattern,Effective Java,我正在阅读有效的java项目#2——构建器模式 这里说JavaBean不是创建具有多个参数的对象的有效方法。 但是如果我用这种方式使用javabean呢: // JavaBeans Pattern public class NutritionFacts { private final int servingSize ; private final int servings ; private final int calories; private final int fat; privat

我正在阅读有效的java项目#2——构建器模式

这里说JavaBean不是创建具有多个参数的对象的有效方法。 但是如果我用这种方式使用javabean呢:

// JavaBeans Pattern 
public class NutritionFacts {
private final int servingSize ;
private final int servings  ;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public NutritionFacts() { }
// Setters
public void setServingSize(int val) { servingSize = val; }
public void setServings(int val) { servings = val; }
public void setCalories(int val) { calories = val; }
public void setFat(int val) { fat = val; }
public void setSodium(int val) { sodium = val; }
public void setCarbohydrate(int val) { carbohydrate = val; }
}
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);
注意,我将所有成员变量作为最终变量

现在可以通过以下方式创建实例:

// JavaBeans Pattern 
public class NutritionFacts {
private final int servingSize ;
private final int servings  ;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public NutritionFacts() { }
// Setters
public void setServingSize(int val) { servingSize = val; }
public void setServings(int val) { servings = val; }
public void setCalories(int val) { calories = val; }
public void setFat(int val) { fat = val; }
public void setSodium(int val) { sodium = val; }
public void setCarbohydrate(int val) { carbohydrate = val; }
}
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);
如果我这样做有什么不对?有人能帮我理解吗? 谢谢
Rajan

您甚至还没有尝试编译此文件,因为很不幸,它将失败。这是因为您声明了一个变量final,它必须在构造函数完成时初始化


这就是为什么最终变量上的setter毫无意义,也就是为什么经常使用Builder模式来解决这个问题。

您甚至没有尝试编译它,因为不幸的是它会失败。这是因为您声明了一个变量final,它必须在构造函数完成时初始化


这就是为什么最终变量上的setter毫无意义,也就是为什么经常使用Builder模式来解决这个问题。

这本书主要说JavaBeans在创建实例时不是线程安全的。它还建议您将可选(非主要)属性的初始化过程放到生成器中。另一件事是,在将代码放在这里之前,您应该测试代码。这本书主要说,当您创建实例时,JavaBeans不是线程安全的。它还建议您将可选(非主要)属性的初始化过程放到生成器中。另一件事是,您应该在将代码放到这里之前测试它。