You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何修改Address类使其支持传入Optional类型的Cities枚举参数

Address类适配Optional入参修改方案

根据你的业务需求可以选择以下两种改造方案:

方案1:最小改动兼容(保留原有Address字段类型,不影响旧逻辑)

仅重载Builder构造方法即可,不需要修改Address原有字段和其他逻辑,同时支持Cities和Optional两种入参:

public static class Builder {
    Cities city;
    String street;
    String houseNumber;

    // 原有构造方法,兼容旧代码调用
    public Builder (Cities city){
        this.city=city;
    }

    // 新增Optional入参构造方法
    public Builder (Optional<Cities> cityOpt){
        // 如果你能保证入参Opt非空可以直接用.get(),否则加orElse处理空场景
        this.city = cityOpt.orElse(null);
    }

    // 原有其他方法保持不变
    public Builder atStreet (String street){
        this.street=street;
        return this;
    }

    public Builder atHouseNumber (String houseNumber){
        this.houseNumber=houseNumber;
        return this;
    }

    public Address build (){
        Address address = new Address();
        address.city=city;
        address.houseNumber=houseNumber;
        address.street=street;
        return address;
    }
}

修改后你在addressInput方法里直接传入Optional变量即可:

return new Address.Builder(city)
        .atStreet(street)
        .atHouseNumber(houseNumber)
        .build();

方案2:全量适配Optional(适合允许city为空的业务场景)

如果你的业务逻辑允许Address的city字段为空,推荐直接将Address内部字段改为Optional类型,从根源避免空指针风险:

public class Address {
    private String street;
    private String houseNumber;
    // 字段改为Optional类型
    private Optional<Cities> city;

    // 补全无参构造
    public Address() {}

    // 保留原有Cities入参的构造方法兼容旧代码
    public Address(Cities city,String street, String houseNumber) {
        this.street = street;
        this.houseNumber = houseNumber;
        this.city = Optional.ofNullable(city);
    }

    // 新增Optional入参的构造方法
    public Address(Optional<Cities> city,String street, String houseNumber) {
        this.street = street;
        this.houseNumber = houseNumber;
        this.city = city == null ? Optional.empty() : city;
    }

    public static class Builder {
        Optional<Cities> city;
        String street;
        String houseNumber;

        // 原有构造方法兼容旧代码
        public Builder (Cities city){
            this.city = Optional.ofNullable(city);
        }

        // 新增Optional入参构造方法
        public Builder (Optional<Cities> city){
            this.city = city == null ? Optional.empty() : city;
        }

        public Builder atStreet (String street){
            this.street=street;
            return this;
        }

        public Builder atHouseNumber (String houseNumber){
            this.houseNumber=houseNumber;
            return this;
        }

        public Address build (){
            Address address = new Address();
            address.city = this.city;
            address.houseNumber = this.houseNumber;
            address.street = this.street;
            return address;
        }
    }

    // 给city的getter也返回Optional,避免外部直接操作null
    public Optional<Cities> getCity() {
        return city;
    }
    // 其他字段的getter、setter保持原有逻辑即可
}

注意:你原有代码中Address类定义了带参构造方法,但Builder的build方法调用了无参构造,需要补全Address的无参构造方法否则会编译报错。

内容的提问来源于stack exchange,提问作者JurajC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:15:10