兰州做高端网站的公司,家政公司电话,江苏国龙翔建设公司网站,急需一个大专文凭《Effective Java》是由 Joshua Bloch 撰写的经典书籍#xff0c;提供了 Java 编程中的最佳实践和建议。在书中的第2条建议“遇到多个构造器参数时要考虑使用构建器”#xff0c;主要是为了处理构造器参数过多时的设计问题。这条建议的主要目的是简化构造器的使用#xff0c…《Effective Java》是由 Joshua Bloch 撰写的经典书籍提供了 Java 编程中的最佳实践和建议。在书中的第2条建议“遇到多个构造器参数时要考虑使用构建器”主要是为了处理构造器参数过多时的设计问题。这条建议的主要目的是简化构造器的使用增加代码的可读性和维护性。
了解重叠构造器模式
假设我们要设计一个Pizza类用于表示不同类型的比萨。比萨可以有不同的配料、大小和类型例如薄底或厚底。如果我们使用构造器来处理这些变体可能会遇到以下问题
public class Pizza {private String size; // 比萨的大小必需参数private String crustType; // 比萨的底部类型可选参数private boolean hasCheese; // 是否有奶酪可选参数// 包含必需参数的构造器public Pizza(String size) {this.size size;this.crustType Regular;this.hasCheese false;}
}目前这个Pizza类只有一个构造器用于生成一个标配版的Pizza它仅接受size作为必需参数并将其他属性设置为默认值。如果我们需要创建不同底部类型的Pizza就必须添加一个新的构造器
// 包含必需参数 size 和可选参数 crustType
public Pizza(String size, String crustType) {this.size size;this.crustType crustType;this.hasCheese false;
}如果我们需要添加奶酪就需要生成一个全参构造器来满足需求。随着配料、大小和底部类型的组合增多每种组合都需要一个新的构造器这就会导致重叠构造器模式的出现。
然而在重叠构造器模式下当一个类有多个参数每个构造器接收不同的参数组合构造器的数量会随着可选参数的增加迅速增加导致代码难以维护。
使用构建器模式优化
为了避免重叠构造器模式产生的副作用我们可以使用构建器模式来优雅地处理具有多个可选参数的类。构建器模式允许我们使用一个灵活的构建器类来设置对象的各个属性而不是依赖于多个构造函数这种模式适用于构建复杂的对象特别是当对象有许多可选参数时可以通过建造者模式来简化对象的创建过程。
具体来说构造器模式是建造者模式Builder Pattern的一个常见实现这种实现通常引入一个嵌套的 Builder 类来辅助构建对象。Builder 类包含一系列 setter 方法用于设置对象的各个部分并提供一个 build() 方法来生成最终的对象。这个模式特别适用于构建复杂对象时参数较多或者有多个可选项的情况。
对上述本文例子使用构建器模式的优化如下 使用构建器模式重写Pizza类 public class Pizza {private String size; // 必需参数private String crustType; // 可选参数private boolean hasCheese; // 可选参数// 私有构造函数private Pizza(Builder builder) {this.size builder.size;this.crustType builder.crustType;this.hasCheese builder.hasCheese;}// 内部构建器类public static class Builder {private final String size; // 必需的参数private String crustType Regular; // 默认值private boolean hasCheese false; // 默认值public Builder(String size) {this.size size;}public Builder crustType(String crustType) {this.crustType crustType;return this;}public Builder hasCheese(boolean hasCheese) {this.hasCheese hasCheese;return this;}public Pizza build() {return new Pizza(this);}}// getters
}使用构建器的build()方法创建Pizza对象 Pizza pizza new Pizza.Builder(Large).crustType(Thin).hasCheese(true).build();通过构建器模式我们避免了重叠构造器模式的缺陷得到了一个更灵活、更易于维护的解决方案。构建器模式使得创建对象时更加直观能够清晰地指定哪些参数是必须的哪些是可选的且能够轻松添加、删除或修改参数。
构建器模式的优势
优势一构建过程与表示的分离
在构建器模式中Builder 类负责处理所有与对象构建相关的逻辑而 Pizza 类只专注于存储数据。这与实际的对象类分开使得对象类的实现更专注于其核心职责而不需要处理复杂的构建过程简化了复杂对象的创建过程。
优势二支持链式调用
Builder类中的每个设置方法都返回 Builder 对象本身
public Builder crustType(String crustType) {this.crustType crustType;return this;
}这种实现可以连续调用多个方法提升代码的简洁性和可读性并且可以按需设置这样调用方可以一步步构建对象而不必关心每一步如何影响对象的创建。
优势三与不可变对象结合时构建器模式能确保创建的对象在构建后保持不可变性
在构建器模式下类的构造器通常被设置为私有的调用方只能通过类内部的 Builder.build() 方法来创建实例。这种方式确保了对象只有在构建完成时才会被创建避免了中途状态的不一致。结合不可变对象详见第17条的设计所有字段在构造时进行初始化且不可变这进一步保障了对象在创建后的稳定性和一致性确保了对象的完整性并且使得对象在多线程环境中更具安全性。