zoukankan      html  css  js  c++  java
  • Effective Java 02 Consider a builder when faced with many constructor parameters

    Advantage

    1. It simulates named optional parameters which is easily used to client API.
    2. Detect the invariant failure(validation error of field) as soon as the invalid parameters are passed, instead of waiting for build to be invoked.
    3. The builder can fill in some fields automatically such as a serial number.
    4. Avoid Class.newInstancebreaks compile-time exception checking

    Disadvantage

    1. A builder must be created first. It's time cost and verbose. It would be better to be used when there are more than 4 parameters.    

    Demo

    package com.effectivejava.creatingobject;

    // 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 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;

    }

       

    /*

    * (non-Javadoc)

    *

    * @see java.lang.Object#toString()

    */

    @Override

    public String toString() {

    // TODO Auto-generated method stub

    return String

    .format("NutritionFacts[servingSize:%d, servings:%d, calories: %d, fat: %d, sodium: %d, carbohydrate: %d]",

    this.servingSize, this.servings, this.calories,

    this.fat, this.sodium, this.carbohydrate);

    }  

    }

    NutritionFacts nutritionFacts = new NutritionFacts.Builder(10, 100)

    .calories(3).carbohydrate(2).fat(1).sodium(4).build();

    System.out.println(nutritionFacts.toString());

    /*******************************************/

    // A builder for objects of type T

    public interface Builder<T> {

    public T build();

    }

     

    Tree buildTree(Builder<? extends Node> nodeBuilder) { ... }

    Summary

    The Builder pattern is a good choice when designing classes whose constructors or static factories would have more than a handful(>4) of parameters. 

    作者:小郝
    出处:http://www.cnblogs.com/haokaibo/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    分享一个MySQL分库分表备份脚本(原)
    mysql配置以及性能优化(转)
    redis 集群配置实战
    Debian安装fail2ban来防止扫描
    关于微信小程序,一些想法
    读书笔记:《HTML5开发手册》-- 现存元素的变化
    linux下如何使用vnstat查看服务器带宽流量统计
    在iOS微信浏览器中自动播放HTML5 audio(音乐)的2种正确方式
    VS自定义项目模板:[4]自定义模板的分组
    VS自定义项目模板:[3]创建自定义模板
  • 原文地址:https://www.cnblogs.com/haokaibo/p/consider-a-builder-when-faced-with-many-constructor-parameters.html
Copyright © 2011-2022 走看看