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
相关产品推荐
相关产品推荐

