• Java当遇到多个构造器参数时考虑构建器


     一般创建实例的方法

    1. 构造方法

    2.静态工厂方法

    3.构建器

    当使用构造器或者静态工厂方法时,创建类的实例不能很好的用于大量的可选参数,类似于有的参数是必须的,有个往往要根据可选参数设置默认值,不同的构造方法。

    这是我们一般习惯使用的重叠构造器*telecoping constructor模式,

    通过使用JavaBean模式,可以改进这种类的构造方法,使用默认的构造方法,设置不同的参数,但是该模式有很大的缺点,因为构造器被分配到不同的构造过程,导致JavaBean可能处于不一致的状态,特别的不适合用于多线程操作,导致类变得可变。

    第三中方法通过构建器,Builder模式,不直接生成想要的对象,而是通过让客户端利用所有必要的参数调用构造器,得到一个builder对象,然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数,最后客户端通过调用无参的builder方法生成不可变对象

    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 paramters-initialized to default values;
    		private int calories=0;
    		private int fat=0;
    		private int carbohydrate=0;
    		private int sodium=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){
    			this.fat=val;
    			return this;
    		}
    		public Builder carbohydrate(int val){
    			this.carbohydrate=val;
    			return this;
    		}
    		public Builder sodium(int val){
    			this.sodium=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;
    	}
    	public static void main(String[] args){
    		NutritionFacts instance=new NutritionFacts.Builder(240, 8).calories(2).build();
    	}
    }
    

      Builder模式性能开销可能大一些,而且代码量看起来也挺长的,、

    适用于可选参数特别多的情况

  • 相关阅读:
    P3383 【模板】线性筛素数
    【模板】矩阵乘法快速幂
    【模板】线性筛素数
    【模板】快速幂
    【模板】归并排序求逆序对
    【模板】归并排序模板
    luogu 1084 疫情控制
    luogu 3155 [CQOI2009]叶子的染色
    luogu 1453 城市环路
    luogu 2607 [ZJOI2008]骑士
  • 原文地址:https://www.cnblogs.com/csxf/p/3465700.html
Copyright © 2020-2023  润新知