二、一个类的构造器的参数有很多时,怎么办?答案:构建器

首先我们举一个例子简单一点的例子,该类中有2个属性,2个必要属性,2个可选择的属性

class A214{
    //必要属性
    private String import1;
    private String import2;
    private String optional1;
    private String optional2;
}
  1. 采用这一种方案:重叠构造器

    class A214{
        //必要属性
        private String import1;
        private String import2;  //可选属性
        private String optional1;
        private int optional2;
        //两个必要属性的构造器
        public A214(String import1, String import2) {
            super();
            this.import1 = import1;
            this.import2 = import2;
        }
        //必要属性+1个可选属性
        public A214(String import1, String import2, String optional1) {
            super();
            this.import1 = import1;
            this.import2 = import2;
            this.optional1 = optional1;
        }
        //必要属性+1个可选属性
        public A214(String import1, String import2, int optional2) {
            super();
            this.import1 = import1;
            this.import2 = import2;
            this.optional2 = optional2;
        }
        //必要属性+2个可选属性
        public A214(String import1, String import2, String optional1, int optional2) {
            super();
            this.import1 = import1;
            this.import2 = import2;
            this.optional1 = optional1;
            this.optional2 = optional2;
        }
    
    }

    这种方法看似很周全。但目前的参数只有4个,要是8个,10个呢??

  2. 采用第二种方法:javabean模式:setter and getter

    @Test
        public void test14() {
            A214 a=new A214();
            a.setImport1("wang");
            a.setImport2("yang");
            a.setOptional1("");
            a.setOptional2(0);
        }
    class A214{
        //必要属性
        private String import1;
        private String import2;  //可选属性
        private String optional1;
        private int optional2;
        public String getImport1() {
            return import1;
        }
        public void setImport1(String import1) {
            this.import1 = import1;
        }
        public String getImport2() {
            return import2;
        }
        public void setImport2(String import2) {
            this.import2 = import2;
        }
        public String getOptional1() {
            return optional1;
        }
        public void setOptional1(String optional1) {
            this.optional1 = optional1;
        }
        public int getOptional2() {
            return optional2;
        }
        public void setOptional2(int optional2) {
            this.optional2 = optional2;
        }
    }

    这种方案创建对象确实很容易,代码也容易阅读
    但是:javabean自身是有缺陷的。由于在不同处构造过程中,可能会导致javabean处于不一致的状态。类无法通过构造器的验证性来保持一致性,而且这种模式阻止了把类变成不可变!(当然也是可以的,只不过花费更多的代码去实现)

  3. 构建器
    不直接生成对象,先获取构建器builder,在builder上设置可选的参数

    @Test
        public void test14() {
            A214 a=new A214.A214_Builder("wang", "yang").builder();
            A214 b=new A214.A214_Builder("wang", "yang").optional1("optional1").builder();
            A214 c=new A214.A214_Builder("wang", "yang").optional1("optional1").optional2(122).builder();
        }
    
    class A214{
        //必要属性
        private String import1;
        private String import2;
        //可选属性
        private String optional1;
        private int optional2;
    
        public static class A214_Builder{
            //必要属性
            private String import1;
            private String import2;
            //可选属性
            private String optional1="";
            private int optional2=0;
            public A214_Builder(String import1, String import2) {
                super();
                this.import1 = import1;
                this.import2 = import2;
            }
    
            public A214_Builder optional1(String optional1){
                this.optional1=optional1;
                return this;
            }
            public A214_Builder optional2(int optional2){
                this.optional2=optional2;
                return this;
            }
            public A214 builder(){
                return new A214(this);
            }
    
        }
        private A214(A214_Builder builder){
            this.import1=builder.import1;
            this.import2=builder.import2;
            this.optional1=builder.optional1;
            this.optional2=builder.optional2;
        }
    }

    使用这种方法,前面所提出的问题已经解决了。但是这样做也有问题,一个是构建器的构建,代码量增加;二个,构建器的构建对性能有一些影响。

时间: 2024-12-22 08:30:02

二、一个类的构造器的参数有很多时,怎么办?答案:构建器的相关文章

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

静态工厂和构造器都有个共同的局限性,就是它们都不能够很好的扩展到大量的可选参数. 如: 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 Nu

Item 2---遇到构造器具有多个参数时,要考虑用构建器;Builder模式

问题,面对这种一个构造器具备多个参数的问题,现有的做法是使用重叠构造器的方式,该方式存在的问题: public class NutritionFacts { private final int servingSize; // (mL) required private final int servings; // (per container) required private final int calories; // optional private final int fat; // (

C#控制台基础 函数的参数是接口 实现接口的类都可以作为参数,很好用

1.代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { //为了便于观看,我就把接口和类都写在一个.cs文件中了 public interface ISay { void Say(); } class Student : ISay { public

徒手撸出一个类Flask微框架(二)路由及路由注册的演变

路由的基本概念: 根据不同的访问路径调用不同的方法或者类 from webob import Response,Request,dec from wsgiref.simple_server import make_server,demo_app def index(request:Request):     res = Response()     res.body = 'index.html'.encode()     return res def showpython(request:Req

为什么提供私有的构造器能保证一个类只有一个实例(有待深入)

1.在我们新建一个类的对象的时候,构造器创建对象后会自动被调用,发生在其他类成员被设置为默认初始值之后,当然如果有字段初始器和初始化块的话,构造器的调用会发生在此之后.构造器的主要作用是在new将对象的引用返回之前初始化对象. 2.其访问权限是private,于是它只能被包含它的类自身所访问,而无法在类的外部调用,故而可以阻止对象的生成.所以,如果一个类只有一个私有构造器,而没有任何公有构造器,是无法生成任何对象的. 3.那么无法生成对象的带有私有构造器的类究竟有什么作用呢?这样的类在实际应用中

Delphi面向对象学习随笔二 编写第一个类

作者:巴哈姆特(转载请注明出处并保持完整) 这回,我们讨论怎么编写我们自己的第一个类.    在编写我们自己的类之前,首先要说的是“类的继承”.    记得前几天,我在和一个朋友讨论类的特点的时候,他说:“类是可以没有构造方法的!”其实类必须有至少一个构造方法的,但是他的话也不全错,可以理解成“我们可以不实现我们自己的构造方法”.    当我们没有显式的为类编写一个构造方法的时候,那么,看上去,这个类好象是没有构造方法,但是实际上,就算你没有为这个类编写一个属于你自己的构造方法的时候,该类还是有

Scala类的构造器与访问器

1.构造器 在Scala中,每个类都有一个主构造器.主构造器与类的定义交织在一起,如下: class Person ( private var _name: String, private var _age: Int) 主构造器会执行类定义中的所有语句.如下,println语句是主构造器的一部分,当类被实例化时,println语句会立即执行. class Person private( private var _name: String, private var _age: Int){ prin

ExtJs--07--Ext.define定义一个类的过程

Ext.onReady(function(){ //Ext定义一个类 Ext.define( "Person", { config:{ name:"jack", age:22 }, fangfa:function(){ Ext.Msg.alert("标题信息","提示内容信息") } , constructor:function(config){ //测试构造器调用没有及参数传递进来没有 // for(var attr in

第二章:创建和销毁对象。ITEM2:遇到多个构造器参数时要考虑用构建器。

如果一个类中有大量的可选参数,有以下几种方式: 1.重叠构造器: package com.twoslow.cha2; /** * 重叠构造器可行,但是当由许多参数的时候,客户端代码很难编写. * @author sai * */ public class Item201 { private final int servingSize; private final int servings; private final int calories; private final int fat; pr