多个构造函数参数时考虑用Builder模式

本文探讨了在Java中如何使用构建器模式来简化对象创建过程,特别是在需要传递多个参数的情况下。通过构建器模式不仅可以提高代码的可读性和灵活性,还能确保线程安全,尤其适用于需要配置大量参数的情况。

当创建对象需要传入多个参数的时候我们通常会根据参数的数量写不同的构造器,具体如下

public A(int a){}

public A(int a, int b){}

public A(int a, int b, int c){}

根据不同的参数调用不同的构造器,但是当参数多了的时候,这种方式不够灵活,所以会实现动态传参的方法

public A(){}

public void seta(int a){}

public void setb(int b){}

public void setc(int c){}

这种方式提高了传参的可读性,也提高了传参的灵活性,但是会增加代码行数,同时在多线程异步执行的时候导致奇怪的错误

 

有没有办法解决呢?既能提高代码可读性,提高参数灵活性,又不会增加代码行数,并保证线程安全呢?

构建器模式登场,先看代码:

public class A {

    private int a;

    private int b;

    private int c;

 

    public static class Builder {

        private int a;

        private int b;

        private int c;

        public Builder(){}

        public Builder seta(int a) { this.a = a; return this} 

        public Builder setb(int b) { this.b = b; return this}

        public Builder setc(int c) { this.c = c; return this}

        public A build() { return new A(this)}

    }

 

    private A(Builder builder) {

        this.a = builder.a;

        this.b = builder.b;

        this.c = builder.c;

    }

}

 

调用构造方法:

A a = new A.Builder().seta(1).setb(2).setc(3).build();

 

这样就解决了以上所说的问题,但是他的缺点同样也是存在的,就是:

1.构造器写起来很复杂

2.创建对象开销比较大

所以构建器模式只适用于需要传入很多种情况参数的时候,比如大于4种参数的配合,才比较划算。

而且值得注意的是:最好在类的设计之初就考虑是否使用构建器,否则日后扩展起来新构建器旧构造器一起用维护起来不方便。

Java中构造多个函数参数有多种方法。 ### 使用多个构造器 可以为类定义多个构造器,每个构造器可以有不同数量或类型的参数。例如在`NumberValue`类中,有两个构造函数,一个不带参数,另一个带`int`类型的单个参数,可通过不同的构造器来满足不同的初始化需求 [^3]。示例代码如下: ```java class NumberValue { private int num; // 无参构造函数 public NumberValue() { this.num = 0; } // 带参构造函数 public NumberValue(int num) { this.num = num; } public void display() { System.out.println(num); } } ``` ### 使用构建器(Builder模式 与构造器相比,Builder模式有一定优势,它可以有多个可变参数。因为Builder利用单独的方法来设置每个参数,每个`setter`方法都可以有一个可变参数。示例代码如下: ```java class Person { private String name; private int age; public static class Builder { private String name; private int age; public Builder name(String name) { this.name = name; return this; } public Builder age(int age) { this.age = age; return this; } public Person build() { return new Person(this); } } private Person(Builder builder) { this.name = builder.name; this.age = builder.age; } } // 使用示例 public class Main { public static void main(String[] args) { Person person = new Person.Builder() .name("Alice") .age(30) .build(); } } ``` ### 在构造函数或方法中传递参数构造函数或方法中传递参数也是常见的方式。不过要注意避免对象之间的紧密耦合,例如可以使用接口来构建对象。如创建一个`TransactionDataExtractor`接口,实现不同的类来构建对象 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值