首页 > 编程语言 >Effective Java-2. 当构造方法参数过多时使用builder模式

Effective Java-2. 当构造方法参数过多时使用builder模式

时间:2022-12-13 14:36:25浏览次数:59  
标签:Java 构造方法 Effective int calories private servings servingSize public

背景

静态工厂和构造方法不能很好的拓展到很多可选参数的场景,因为参数过多的时候,调用其构造方法不太能知道每个位置参数的含义,容易出bug

那么为这个类编写什么样下的构造方法或静态工厂呢?

  • 可伸缩构造方法模式
    • 例子:
    • 这个构造方法的调用需要许多你不想设置的参数,但是你不得不为它们传递一个值。 在这种情况下,我们为属性传递了 0 值。随着参数的增加容易失控
    • 难以读懂
// Telescoping constructor pattern - does not scale well!
class NutritionFacts {
    private final int servingSize; // (mL) required
    private final int servings; // (per container) required
    private final int calories; // (per serving) optional
    private final int fat; // (g/serving) optional
    private final int sodium; // (mg/serving) optional
    private final int carbohydrate; // (g/serving) optional
    public NutritionFacts(int servingSize, int servings) {
        this(servingSize, servings, 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;
    }
}
  • JavaBeans模式
    • 使用无参构造方法创建对象,调用setter方法设置成员属性
    • 构造对象过程被setter方法多次分割,可能处于不一致状态
    • 排除了让类不可变的的可能性
// JavaBeans Pattern - allows inconsistency, mandates mutability
public class NutritionFacts {
// Parameters initialized to default values (if any)
	private int servingSize = -1; // Required; no default value
	private int servings = -1; // Required; no default value
	private int calories = 0;
	private int fat = 0;
	private int sodium = 0;
	private int carbohydrate = 0;
	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);

Builder模式

  • 可以生成流畅的API,易于阅读
  • builder 可以有多个可变参数,因为每个参数都是在它自己的方法中指定的,可以将传递给多个调用的参数聚合到单个属性中
  • 单个 builder 可以重复使用来构建多个对象,builder 的参数可以在构建方法的调用之间
    进行调整,以改变创建的对象,可以在创建时自动添加一些属性(例如递增的序列号)

具体用法参考建造者模式!!!

缺点:

  • 为了创建对象,必须创建一个Builder对象,可能会影响性能
  • builder模式比神所构造方法模式冗长,因此builder模式适用有足够的参数(或者未来可能有)

标签:Java,构造方法,Effective,int,calories,private,servings,servingSize,public
From: https://www.cnblogs.com/wyia/p/16978667.html

相关文章

  • Effective Java-1.考虑使用静态工厂方法代替构造方法
    静态工厂方法的优点不像构造方法,静态工厂是有名字的精心构造的名称使得静态工厂方法更容易使用和理解,即知道创建的是什么对象与构造方法不同,不用每次都创建一个新的......
  • javascript中setInterval越来越快的问题解决方法
    vartimerfunctionrun(){ //clearInterval要放在方法开始,不然的话,下面的代码还没运行到clearInterval,又开始了循环了。if(timer){clearInter......
  • Java NIO、NIO.2学习笔记
    相关学习资料http://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html 目录1.NIO、NIO.2简介2.NIO中的关键技术 1.NIO、NIO.2简介Java中的输入流、输出......
  • java 将小数拆分为两部分+浮点型精度丢失问题
    问题:将一个String类型的小数拆分为整数部分和小数部分,如9.9拆分为9和0.91.将小数的整数和小数部分拆分开publicfloatnumberSub(StringtotalMoney){floatmoneyFl......
  • Java方法
    方法方法的定义方法就是一段可重复调用的代码段,例如:有某段长度约100行的代码,要在多个地方使用此段代码,如果在各个地方都重复编写此部分代码的话,则肯定会比较麻烦,而且此部......
  • pom之 数据源信息 spring-boot-starter-jdbc ,mysql-connector-java
    <!--    数据源信息--><!--    <dependency>--><!--      <groupId>org.springframework.boot</groupId>--><!--      <arti......
  • [Java EE] java.net.SocketException: Connection reset【解决中】
    1错误描述6:44:33.112][DEBUG][http-nio-9527-exec-3][HttpClientUtil]httpposturl:http://bdp-gateway-service-parent-backend-service.bigdata/bdp/public/api/......
  • Java 中的抽象介绍
    这篇文章主要介绍了Java 中的抽象,数据抽象是一种仅向用户显示基本细节的属性。不向用户显示琐碎或非必需的单元,下面文章Java抽象详细内容,需要的朋友可以参考一下目录1......
  • idea 自带java 反编译工具问题
    就在最近升级到idea最新版本,发现以前java-decompiler命令行工具不能使用了,运行会有错误解决方法找到一个地版本的idea拷贝java-decompiler.jar直接替换,或者直接使用......
  • Java程序员除了做增删改查还能干嘛?
      就以Java后端开发为例,说说不同级别程序员干的事情。1初级开发,大概是有3年Java开发经验。  22年底,上海,这批程序员如果学历是本科,薪资一般是8k到2w,当然如果能进......