`
lxiaodao
  • 浏览: 119688 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

EffectiveJava-第2条 遇到多个构造器参数时要考虑用构建器

阅读更多
遇到多个构造器参数时要考虑用构建器,且看最佳实践代码
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 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)
		{
			fat = val;
			return this;
		}

		public Builder carbohydrate(int val)
		{
			carbohydrate = val;
			return this;
		}

		public Builder sodium(int val)
		{
			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;
		//对象域抛出异常
		if(this.fat>this.sodium){
		    throw new IllegalArgumentException("The fat must be little than sodium!!");
		}
	}

	public static void main(String[] args)
	{
		NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).calories(100).sodium(35).carbohydrate(27).build();
		System.out.println(cocaCola);
	}
}
                

4、builder模式解决了上述问题
    适应多参数,安全,方便编写,可维护性高。   
5、builder实现   
    builder模式的一种实现方式:NutritionFacts类
    对参数强加约束条件的方式。      
6、builder模式缺点
    为了创建对象,必须先创建它的构建器,开销增大。
    实现冗长,比重叠构造器更冗长,只有在很多参数的时候才使用。   
总结   
   本实现是builder模式的实现的一种方式。  
   如果类的构造器或者静态工厂中具有多个参数,设计时使用Builder模式是很好的选择。
   Q:什么情况下不用??hibernate的domain
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics