mirror of
https://github.com/sjsdfg/effective-java-3rd-chinese.git
synced 2025-03-16 04:10:35 +08:00
update: 2. 当构造方法参数过多时使用 builder 模式
This commit is contained in:
parent
e5fec3ce9b
commit
4b59b63729
@ -174,7 +174,7 @@ NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
|
||||
|
||||
为了简洁起见,省略了有效性检查。 要尽快检测无效参数,检查 builder 的构造方法和方法中的参数有效性。 在 `build` 方法调用的构造方法中检查包含多个参数的不变性。为了确保这些不变性不受攻击,在从 builder 复制参数后对对象属性进行检查(条目 50)。 如果检查失败,则抛出 `IllegalArgumentException` 异常(条目 72),其详细消息指示哪些参数无效(条目 75)。
|
||||
|
||||
Builder 模式非常适合类层次结构。 使用平行层次的 builder,每个嵌套在相应的类中。 抽象类有抽象的 builder; 具体的类有具体的 builder。 例如,考虑代表各种比萨饼的根层次结构的抽象类:
|
||||
Builder 模式非常适合类层次结构。 使用平行层次的 builder,每个嵌套在相应的类中。 抽象类有抽象的 builder;具体的类有具体的 builder。 例如,考虑代表各种比萨饼的根层次结构的抽象类:
|
||||
|
||||
```java
|
||||
// Builder pattern for class hierarchies
|
||||
@ -267,9 +267,9 @@ public class Calzone extends Pizza {
|
||||
}
|
||||
```
|
||||
|
||||
请注意,每个子类 builder 中的 `build` 方法被声明为返回正确的子类:`NyPizza.Builder` 的 `build` 方法返回 `NyPizza`,而 `Calzone.Builder` 中的 `build` 方法返回 `Calzone`。 这种技术,其一个子类的方法被声明为返回在超类中声明的返回类型的子类型,称为协变返回类型 ( covariant return typing)。 它允许客户端使用这些 builder,而不需要强制转换。
|
||||
请注意,每个子类 builder 中的 `build` 方法被声明为返回正确的子类:`NyPizza.Builder` 的 `build` 方法返回 `NyPizza`,而 `Calzone.Builder` 中的 `build` 方法返回 `Calzone`。 这种技术,其一个子类的方法被声明为返回在超类中声明的返回类型的子类型,称为协变返回类型(covariant return typing)。 它允许客户端使用这些 builder,而不需要强制转换。
|
||||
|
||||
这些「分层 builder」的客户端代码基本上与简单的 `NutritionFacts` builder 的代码相同。为了简洁起见,下面显示的示例客户端代码假设枚举常量的静态导入:
|
||||
这些「分层 builder(hierarchical builders)」的客户端代码基本上与简单的 `NutritionFacts` builder 的代码相同。为了简洁起见,下面显示的示例客户端代码假设枚举常量的静态导入:
|
||||
|
||||
```java
|
||||
NyPizza pizza = new NyPizza.Builder(SMALL)
|
||||
|
Loading…
Reference in New Issue
Block a user