多個參數使用構建器的使用(一般多於4個參數時候)

一、常用解決方法(不能很好的擴展到大量的可選參數)

1、靜態工廠類

     缺點:a、類如果不含有共有的或者受保護的構造器,就不能被子類化。

                b、他們與其他的靜態方法實際上沒有任何的區別。

2、使用構造器

     a、重疊構造器:該方法可行,但是當參數很多的時候,我們會發現客戶端代碼很難編寫,需要傳一些不需要的字段。

     b、set方法:這種模式彌補了重疊構造器的不足,雖然這種方式,閱讀起來也比較容易,但這種方法有明顯的缺點。

              1、這個構造的過程被分到了幾個調節中,在構造的過程中可能出現不一致的狀態,類無法僅僅通過檢驗構造器參數的有效性保持一致性,視圖使用不一致狀態的對象,將會導致失敗。

二、構建器的使用

我們可以讓類實例化的時候構造函數包含必填的參數,然後選填的參數則可以不必要自己來實例化

舉例:

package com.shuang.javabean;

/**
 * 
 * @author shuang
 *
 */
public class UserInfo {
    
    /**
     * 用戶名
     */
    private final String userName;
    /**
     * 密碼
     */
    private final String password;
    /**
     * 年齡
     */
    private final int age;
    /**
     * 手機號碼
     */
    private final String phone;
    /**
     * 體重
     */
    private final int weight;
    /**
     * 脂肪含量
     */
    private final int fat;
    
    
    public String toString() {
        return "UserInfo [userName=" + userName + ", password=" + password + ", age=" + age + ", phone=" + phone
                + ", weight=" + weight +  ", fat=" + fat + "]";
    }
    
    /**
     * 內部構造器
     * 
     */
    public static class Builder{
        //必要的參數
        private  String userName;
        private  String password;
        /**
         * 不必要的參數
         */
        private int weight = 0;
        private int age = 0;
        private int fat = 0;
        private String phone = null;
        
        public Builder(String userName ,String password) {
            this.userName  = userName;
            this.password = password;
        }
        
        public Builder weight(int weight){
            this.weight = weight;
            return this;
        }
        public Builder age(int age){
            this.age = age;
            return this;
        }
        public Builder fat(int fat){
            this.fat = fat;
            return this;
        }
        
        public UserInfo build(){
            return new UserInfo(this);
        }
    }
    
    private UserInfo(Builder builder){
        userName = builder.userName;
        password = builder.password;
        phone = builder.phone;
        weight = builder.weight;
        age = builder.age;
        fat = builder.fat;
    }
}

測試代碼:

package com.shuang.test;

import com.shuang.javabean.UserInfo;

public class Test {
    
    public static void main(String[] args) {
        UserInfo userInfo = new UserInfo.Builder("張三","123456").build();
        System.out.println(userInfo);
        
        UserInfo userInfo1 = new UserInfo.Builder("李四","654321").age(18).build();
        System.out.println(userInfo1);
    }
}
優點:容易編寫,易於閱讀參數可選,可以像構造器一樣對參數進行校驗等等

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章