zoukankan      html  css  js  c++  java
  • [Effective Java 读书笔记] 第二章 创建和销毁对象 第二条

    第二条 遇到多个构造器参数时,可以考虑用构建器

        当遇到有多个构造器参数时,常见的是用重叠构造器,即:

    public class TestClass{
        public TestClass(int para0){
            this(para0,0);
        }    
        public TestClass(int para0,int para1){
            this(para0,para1,0);
        }  
        public TestClass(int para0,int para1,int para2){
           this.para0 = para0;
           this.para1 = para1;
           this.para2 = para2;
        }                 
    } 

      当需要的参数多了以后,上述方法难以阅读,参数含义不太明显,一长串类型相同的参数也容易有微妙的错误,比如颠倒等。

      而如果使用JavaBeans模式,即为每个参数创建一个setter的方法,这样可读性提高,每个参数的设置都有含义,但是整个构建方法被分为几个调用,导致构建过程中处于不一致的状态,需要额外保证线程安全

      推荐使用 Builder模式,抄了网上的一个代码段:

       

    public class DoDoContact {
        private final int    age;
        private final int    safeID;
        private final String name;
        private final String address;
     
        public int getAge() {
            return age;
        }
     
        public int getSafeID() {
            return safeID;
        }
     
        public String getName() {
            return name;
        }
     
        public String getAddress() {
            return address;
        }
     
        public static class Builder {
            private int    age     = 0;
            private int    safeID  = 0;
            private String name    = null;
            private String address = null;
    
       // 构建的步骤
            public Builder(String name) {
                this.name = name;
            }
     
            public Builder age(int val) {
                age = val;
                return this;
            }
     
            public Builder safeID(int val) {
                safeID = val;
                return this;
            }
     
            public Builder address(String val) {
                address = val;
                return this;
            }
     
            public DoDoContact build() { // 构建,返回一个新对象
                return new DoDoContact(this);
            }
        }
     
        private DoDoContact(Builder b) {
            age = b.age;
            safeID = b.safeID;
            name = b.name;
            address = b.address;
     
        }
    }

    //调用:
      DoDoContact ddc = new DoDoContact.Builder("Ace").age(10)
                    .address("beijing").build();
     

        

  • 相关阅读:
    P2018 消息传递[dp]
    P1436 棋盘分割[dp]
    一条线段引发的思考
    浅谈树上差分
    P2680 运输计划[二分+LCA+树上差分]
    P1600 天天爱跑步[桶+LCA+树上差分]
    P4560 [IOI2014]Wall 砖墙
    P1311 选择客栈[模拟]
    P1314 聪明的质监员[二分答案]
    Linux snmp导入MIB库
  • 原文地址:https://www.cnblogs.com/jiangz222/p/4753200.html
Copyright © 2011-2022 走看看