<div class="iteye-blog-content-contain" style="font-size: 16px">
今天是讲《Effective Java》中的第二条:遇到多个构造器参数时要考虑用构建器
这节我们先看代码(这些代码是我直接从书上抄下来的,这节的代码示例给的非常好)
示例一:
public class NutritionFacts{
private final int servingSize; //required
private final int servings; //required
private final int calories; //optional
private final int fat;
private final int sodium;
private final int carbohydrate;
public NutritionFacts(int servingSize , int servings){
this(servingSize,servings,calories,0);
}
Public NutritionFacts(int servingSize, int servings, int calories){
This(servingSize,servings,calories ,0);
}
Public NutritionFacts(int servingSize, int servings, int calories, int fat){
This(servingSize,servings,calories,fat,0);
}
Public NutritionFacts(int servingSize,int servings,int calories,int fat,int sodium){
This(servingSize,servings,calories,fat,sodium,0);
}
Public NutritionFacts(int servingSize,int servings,int calories,int fat,int sodium,int carbohydrate){
this. servingSize= servingSize;
this. Servings= servings;
this. calories= calories;
this.fat=fat;
this. sodium= sodium;
this. carbohydrate= carbohydrate;
}
}
那我们都是这么使用的:
NutritionFacts cocaCola= new NutritionFacts(240,8,100,0,0,27);
有些参数我们本来是不想设置的,但是又不得不给它们传值,于是给传个0。现在是6个参数,如果是10个或再多呢?对于客户端代码是很难写的,那如果有两参数你给记错了,传错值,那编译器也不会提示错误,到程序运行时出现了错误,那就更麻烦了。
使用JavaBean模式来替代:
public class NutritionFacts{
private int servingSize=-1; //required
private int servings=-1; //required
private int calories=0; //optional
private int fat=0;
private int sodium=0;
private int carbohydrate=0;
public NutritionFacts(){}
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. setCarbohydrate(27);
JavaBean模式的缺点:构造过程中被分割到几个调用中,在构造过程中Javabean可能处于不一致状态。另外一点,JavaBean模式阻止了把类做成不可变的可能。
幸运有有下面这种:
public class NutritionFacts{
private final int servingSize; //required
private final int servings; //required
private final int calories; //optional
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder{
private final int servingSize;
private final int servings;
private int calories=0; //optional
private int fat=0;
private int sodium=0;
private int carbohydrate=0;
public Builder(int servingSize,int servings){
this.servingSize = servingSize;
this.serving=servings;
}
public Butilder calories(int val){
calories=val; return this;
}
public Butilder fat (int val){
fat =val; return this;
}
public Butilder sodium (int val){
sodium =val; return this;
}
public Butilder carbohydrate (int val){
carbohydrate =val; return this;
}
public NutritionFacts build(){
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder){
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
NutritionFacts cocaCola=new NutritionFacts.Builder(240,8).calories(100).carbohydrate(27).build();
build方法可以检验这些约束条件,将参数从bulider拷贝到对象中之后,并在对象域而不是buider域中对它们进行检验。
总结一下什么时候使用Builder模式呢?
如果类的构造器或者静态工厂方法中具有多个参数,设计这种类时,Builder模式就是中不错的选择,特别是在大多数参数是可选的情况下。
</div>
分享到:
相关推荐
标题“effective-java.pdf”与描述“effective-java.pdf”表明本文档是关于Java编程实践的指南,且内容可能来自于一本名为《Effective Java》的书籍,该书是由Joshua Bloch编写,被广泛认为是Java编程的权威指南。...
2. **构建器(Builder pattern)**:当类有多个构造器参数时,构建器模式提供了一种更清晰的构造对象的方式,避免了“参数过多”的问题。 3. **单例模式**:通过私有构造器和枚举类型强化单例属性,确保线程安全且...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,中文版第二版更是深受广大Java开发者喜爱。这本书提供了许多实用的编程实践和经验教训,帮助开发者编写出更高效、可维护的Java代码。这里我们将...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,第二版发布于2008年。这本书旨在提供实用的编程指导,帮助开发者写出更高效、更可维护的Java代码。以下是对书中核心知识点的详细解读: 1. *...
#### 第二章 创建/销毁对象 ##### 用静态工厂方法代替构造器 在面向对象编程中,对象的创建通常是通过构造器来完成的。然而,在某些情况下,使用静态工厂方法来创建对象可能会更加灵活和高效。 **静态工厂方法的...
3. **泛型**:第二版《Effective Java》详尽讨论了Java泛型,包括其基本概念、类型擦除、边界通配符、类型推断以及如何有效地使用泛型类和泛型方法。 4. **构造器**:书中阐述了如何设计和使用构造器来创建对象,...
在《Effective Java》第三版中,作者分享了28项关键的编程策略,涵盖了类和对象的设计、泛型、枚举、集合、并发等多个方面。以下是这些主题的一些核心知识点: 1. **使用final、static和private修饰符**:强调这三...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,第二版更是程序员们不可或缺的参考书籍。这本书深入探讨了如何编写出高质量、高效、可维护的Java代码,涵盖了众多最佳实践和设计模式。这里我们将...
第 2 条:当面临许多构造函数参数时考虑构建器 伸缩构造函数模式有效,但是当参数很多时很难编写客户端代码,而且更难阅读 Builder 模式模拟命名的可选参数 Class.newInstance 破坏编译时异常检查 在设计具有构造...
#### 第二部分:构建第一个帮助集 - **2.1 创建帮助集的目录结构**:指导读者按照特定规则建立必要的文件夹和文件。 - **2.2 创建帮助集的数据和导航文件**:讲解了如何编写用于组织和导航的帮助集文件。 - **2.3 ...
2. **环境配置**:讲解如何安装Java Development Kit (JDK) 和设置环境变量,为后续开发工作奠定基础。 3. **语法基础**:包括数据类型、变量、运算符、流程控制(如if-else、switch、for、while循环)、函数等基本...
#### 一、《Effective Java》第二版 - **书名及版本**:Effective Java(第二版) - **出版社**:Prentice Hall PTR - **作者**:Joshua Bloch - **作者背景**:Joshua Bloch曾在Sun Microsystems工作,是Java平台...
2. **代码混淆**:为了防止逆向工程,应使用ProGuard或R8工具对应用的Java代码进行混淆,使其难以理解。 3. **数据加密**:存储在设备上的用户数据,包括偏好设置、数据库和文件,应使用AES等强加密算法进行加密。...
第二部分的学习资料可能涵盖多个主题,包括核心Java、J2EE框架、数据库交互、Web开发、面试准备等。以下是基于这些关键词可能包含的一些详细知识点: 1. **核心Java**: - Java语法基础:包括变量、数据类型、...
- **简介**: 本书是Java领域的一本权威指南,第二版得到了Google Java团队的强烈推荐。书中提供了大量的最佳实践建议,对于提高代码质量和可维护性非常有帮助。 5. **《Java设计模式》** - **简介**: 本书详细...