多个参数使用构建器的使用(一般多于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);
    }
}
优点:容易编写,易于阅读参数可选,可以像构造器一样对参数进行校验等等

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值