Effective Java笔记 - 创建对象时扩展参数的几种模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Effective Java笔记 - 创建对象时扩展参数的几种模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2395字,纯文字阅读大概需要4分钟。
内容图文
![Effective Java笔记 - 创建对象时扩展参数的几种模式](/upload/InfoBanner/zyjiaocheng/611/653a4949a52842eeaf1951195bf4b1c9.jpg)
Effective Java笔记 - 创建对象时扩展参数的几种模式
静态工厂与构造器的一个局限性是遇到大量可选参数时不便于扩展。
传统的方式是使用重叠构造器(telescoping constructor),先提供一个只有必选参数的构造器,然后逐一添加可选参数所对应的构造器。但是这种方法仍然不便于扩展,而且当参数量庞大时代码的实现和阅读都很困难。
另一种方式是JavaBeans模式,先调用无参构造函数,创建出对象,然后用setter方法设置所需的参数。这种方法更简便,但是存在严重缺陷,那就是创建对象的过程被分割成许多个调用,在创建的过程中一个JavaBean可能会进入不一致的状态,若在此时使用这个对象可能会导致难以发现的bug。JavaBeans模式剥夺了使类immutable的可能性。补救措施是创建完成后“冷冻”对象,等到对象“冻结”后才可使用。但是这种方法不常用,而且也容易产生runtime error。
第三种方式是一种Builder模式,它结合了JavaBeans模式和重叠构造器模式。客户端先用含所有必选参数的构造函数或静态工厂方法创建一个builder对象,再用setter方法设置可选参数。最后客户端调用build()生成对象。Builder实际上是所要创建对象的类的静态内部类。
例:
// Builder 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 static class Builder {
// Required parameters
private final int servingSize;
private final int servings;
// Optional parameters - initialized to
// default values
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) {
calories = val;
return this;
}
public Builder fat(int val) {
fat = val;
return this;
}
public Builder sodium(int val) {
sodium = val;
return this;
}
public Builder 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).sodium(35).carbohydrate(27).build();
这个类是immutable的,并且实现了链式调用。Builder模式模拟了Python和Scala里的有名可选参数。缺陷是builder对象占用资源。
参考文献
- Bloch, J. (2017). Effective Java (3rd ed.). Addison-Wesley Professional.
内容总结
以上是互联网集市为您收集整理的Effective Java笔记 - 创建对象时扩展参数的几种模式全部内容,希望文章能够帮你解决Effective Java笔记 - 创建对象时扩展参数的几种模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。