Java 如何写 Builder

你有没有遇到过这种情况:要给对象设置好几个属性,光写构造方法就得堆一堆参数,少写一个还得重新来?比如做个外卖订单,要填姓名、地址、电话、菜品、配送时间,一不小心漏了“备注”,还得重新调用一次 setter 方法改,麻烦得很。

今天就给大家讲个能解决这个麻烦的好方法——用 Builder 模式写 Java 代码,哪怕是新手也能轻松上手。

Java 如何写 Builder

先搞懂 Builder 是什么?一句话说清

Builder 说白了就是个“定制工具”,它不会直接生成最终的对象,而是先把你要的属性一步步攒起来,等所有需要的内容都确认好了,再一次性“组装”出完整的对象。就像你去奶茶店点单,不会直接把所有料全倒在杯子里,而是先告诉店员“要中杯”“加珍珠”“少糖”“热饮”,等所有要求确认后,店员才会做好递到你手里。

写个简单的 Builder 例子:做个“外卖订单”

咱们用大家熟悉的外卖订单来练手,先一步步拆解怎么写:

第一步:先写订单的“基础类”

这个类就是我们要生成的最终对象,属性就是外卖的核心信息,为了安全,把构造方法设成私有的,不让别人随便乱建:

`java

public class Order {

// 这些是订单的必要或可选属性

private String name; // 收货人

private String address; // 地址

private String phone; // 电话

private String dish; // 菜品

private String remark; // 备注(可选)

// 构造方法私有,只能通过Builder创建

private Order(Builder builder) {

this.name = builder.name;

this.address = builder.address;

this.phone = builder.phone;

this.dish = builder.dish;

this.remark = builder.remark;

}

// 可以加个打印方法,方便看结果

public void printOrder() {

System.out.println("收货人:" + name + ",地址:" + address + ",电话:" + phone + ",菜品:" + dish + ",备注:" + remark);

}

}

`

第二步:写 Builder 工具类

这个类就是刚才说的“奶茶店员”,它的任务是把属性一个个攒起来,最后生成 Order 对象。每个属性对应一个“设置方法”,而且方法返回自己(Builder),这样就能连起来写,不用每次都重复写类名:

`java

public static class Builder {

// 和Order的属性对应

private String name;

private String address;

private String phone;

private String dish;

private String remark;

// 设置每个属性的方法,返回Builder本身

public Builder name(String name) {

this.name = name;

return this;

}

public Builder address(String address) {

this.address = address;

return this;

}

public Builder phone(String phone) {

this.phone = phone;

return this;

}

public Builder dish(String dish) {

this.dish = dish;

return this;

}

// 可选属性的设置,不写也没关系

public Builder remark(String remark) {

this.remark = remark;

return this;

}

// 最后一步,调用build()生成Order对象

public Order build() {

// 这里可以加参数校验,比如电话不能是空的,避免出错

if (phone == null || phone.isEmpty()) {

throw new IllegalArgumentException("电话不能为空");

}

return new Order(this);

}

}

`

第三步:用 Builder 来创建订单

现在用的时候就特别灵活,想填什么属性就加什么,还能连起来写,一目了然:

`java

public class TestBuilder {

public static void main(String[] args) {

// 点一份加备注的外卖

Order myOrder = new Order.Builder()

.name("张三")

.address("XX小区3栋201")

.phone("13800138000")

.dish("番茄炒蛋盖饭")

.remark("麻烦多放饭,谢谢")

.build();

myOrder.printOrder();

// 另一个订单,没有备注

Order friendOrder = new Order.Builder()

.name("李四")

.address("XX公寓5栋103")

.phone("13900139000")

.dish("宫保鸡丁盖饭")

.build();

friendOrder.printOrder();

}

}

`

为什么 Builder 比传统方法好用?

对比一下就知道:如果用普通的构造方法,可能要写好几个重载,比如“只填必填属性”“必填加备注”“必填加配送时间”,要是属性多,重载方法能有十几个,想想都头大。而用 Builder 就不一样了,不管加多少属性,都只用写一套设置方法,想加什么就加什么,还不会漏必填项——刚才的 build() 方法里我们加了电话校验,少填就直接报错,避免了无效的订单。

其实 Builder 模式在 Java 里还经常被用在实体类、配置类的创建上,比如 Spring 里的一些配置对象,或者你写业务代码里的复杂对象,用它就能让代码更清爽,不容易出错。

上一篇 JavaScript 事件循环怎么理解