`

读《Effective Java》总结第二条:构建器

    博客分类:
  • java
阅读更多
<div class="iteye-blog-content-contain" style="font-size: 16px">
    今天是讲《Effective Java》中的第二条:遇到多个构造器参数时要考虑用构建器

    这节我们先看代码(这些代码是我直接从书上抄下来的,这节的代码示例给的非常好)

    示例一:


public class NutritionFacts{
    private final int servingSize;     //required
    private final int servings;        //required
    private final int calories;    //optional
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

   public NutritionFacts(int servingSize , int servings){
              this(servingSize,servings,calories,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;

   }

}



 

那我们都是这么使用的:

NutritionFacts cocaCola= new NutritionFacts(240,8,100,0,0,27);

有些参数我们本来是不想设置的,但是又不得不给它们传值,于是给传个0。现在是6个参数,如果是10个或再多呢?对于客户端代码是很难写的,那如果有两参数你给记错了,传错值,那编译器也不会提示错误,到程序运行时出现了错误,那就更麻烦了。
使用JavaBean模式来替代:
public class NutritionFacts{
    private int servingSize=-1;     //required
    private int servings=-1;        //required
    private int calories=0;    //optional
    private int fat=0;
    private int sodium=0;
    private int carbohydrate=0;

public NutritionFacts(){}

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. setCarbohydrate(27);



JavaBean模式的缺点:构造过程中被分割到几个调用中,在构造过程中Javabean可能处于不一致状态。另外一点,JavaBean模式阻止了把类做成不可变的可能。

幸运有有下面这种:
public class NutritionFacts{
    private final int servingSize;     //required
    private final int servings;        //required
    private final int calories;    //optional
    private final int fat;
    private final int sodium;
    private final int carbohydrate;
    
    public static class Builder{

        private final int servingSize;    
    private final int servings;        


      private int calories=0;    //optional
      private int fat=0;
      private int sodium=0;
      private int carbohydrate=0;
     
      public Builder(int servingSize,int servings){
           this.servingSize = servingSize;
           this.serving=servings;
      }
      
      public Butilder calories(int val){
        calories=val; return this;
       }
public Butilder fat (int val){
        fat =val; return this;
       }
public Butilder sodium (int val){
        sodium =val; return this;
       }
public Butilder 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).carbohydrate(27).build();




build方法可以检验这些约束条件,将参数从bulider拷贝到对象中之后,并在对象域而不是buider域中对它们进行检验。


总结一下什么时候使用Builder模式呢?
    如果类的构造器或者静态工厂方法中具有多个参数,设计这种类时,Builder模式就是中不错的选择,特别是在大多数参数是可选的情况下。




</div>
分享到:
评论

相关推荐

    effective-java.pdf

    标题“effective-java.pdf”与描述“effective-java.pdf”表明本文档是关于Java编程实践的指南,且内容可能来自于一本名为《Effective Java》的书籍,该书是由Joshua Bloch编写,被广泛认为是Java编程的权威指南。...

    Effective Java第三版1

    2. **构建器(Builder pattern)**:当类有多个构造器参数时,构建器模式提供了一种更清晰的构造对象的方式,避免了“参数过多”的问题。 3. **单例模式**:通过私有构造器和枚举类型强化单例属性,确保线程安全且...

    Effective-Java:Effective Java中文版第二版示例代码

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,中文版第二版更是深受广大Java开发者喜爱。这本书提供了许多实用的编程实践和经验教训,帮助开发者编写出更高效、可维护的Java代码。这里我们将...

    effectiveJava的笔记

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,第二版发布于2008年。这本书旨在提供实用的编程指导,帮助开发者写出更高效、更可维护的Java代码。以下是对书中核心知识点的详细解读: 1. *...

    Effective-Java读书笔记(上)

    #### 第二章 创建/销毁对象 ##### 用静态工厂方法代替构造器 在面向对象编程中,对象的创建通常是通过构造器来完成的。然而,在某些情况下,使用静态工厂方法来创建对象可能会更加灵活和高效。 **静态工厂方法的...

    1_Effective_Java_2nd_Edition_proglib_java_Joshua_

    3. **泛型**:第二版《Effective Java》详尽讨论了Java泛型,包括其基本概念、类型擦除、边界通配符、类型推断以及如何有效地使用泛型类和泛型方法。 4. **构造器**:书中阐述了如何设计和使用构造器来创建对象,...

    Effective.Java3rd.zip

    在《Effective Java》第三版中,作者分享了28项关键的编程策略,涵盖了类和对象的设计、泛型、枚举、集合、并发等多个方面。以下是这些主题的一些核心知识点: 1. **使用final、static和private修饰符**:强调这三...

    Java-Effective:Java Effective 2nd Edition书中的源代码

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,第二版更是程序员们不可或缺的参考书籍。这本书深入探讨了如何编写出高质量、高效、可维护的Java代码,涵盖了众多最佳实践和设计模式。这里我们将...

    effectiveJava:有效的java se 书中的例子

    第 2 条:当面临许多构造函数参数时考虑构建器 伸缩构造函数模式有效,但是当参数很多时很难编写客户端代码,而且更难阅读 Builder 模式模拟命名的可选参数 Class.newInstance 破坏编译时异常检查 在设计具有构造...

    解析Java虚拟机器开发:权衡优化、高效和安全的最优方案.pdf

    #### 第二部分:构建第一个帮助集 - **2.1 创建帮助集的目录结构**:指导读者按照特定规则建立必要的文件夹和文件。 - **2.2 创建帮助集的数据和导航文件**:讲解了如何编写用于组织和导航的帮助集文件。 - **2.3 ...

    java学习PDF下载地址全 百度云盘下载

    2. **环境配置**:讲解如何安装Java Development Kit (JDK) 和设置环境变量,为后续开发工作奠定基础。 3. **语法基础**:包括数据类型、变量、运算符、流程控制(如if-else、switch、for、while循环)、函数等基本...

    java领域四大名著

    #### 一、《Effective Java》第二版 - **书名及版本**:Effective Java(第二版) - **出版社**:Prentice Hall PTR - **作者**:Joshua Bloch - **作者背景**:Joshua Bloch曾在Sun Microsystems工作,是Java平台...

    effective-android-security:构建一个安全的安卓应用

    2. **代码混淆**:为了防止逆向工程,应使用ProGuard或R8工具对应用的Java代码进行混淆,使其难以理解。 3. **数据加密**:存储在设备上的用户数据,包括偏好设置、数据库和文件,应使用AES等强加密算法进行加密。...

    java/j2ee学习资料大全第二部分(共5部分)

    第二部分的学习资料可能涵盖多个主题,包括核心Java、J2EE框架、数据库交互、Web开发、面试准备等。以下是基于这些关键词可能包含的一些详细知识点: 1. **核心Java**: - Java语法基础:包括变量、数据类型、...

    java推荐书籍

    - **简介**: 本书是Java领域的一本权威指南,第二版得到了Google Java团队的强烈推荐。书中提供了大量的最佳实践建议,对于提高代码质量和可维护性非常有帮助。 5. **《Java设计模式》** - **简介**: 本书详细...

Global site tag (gtag.js) - Google Analytics