如何用Java Lombok Builder根据device自动设置deviceType?
自动根据device设置deviceType的解决方案
给你几种可行的实现方式,都能满足你不想手动设置deviceType、逻辑自动完成的需求:
方式一:自定义Builder的device方法
利用Lombok允许重写Builder方法的特性,在设置device的同时直接计算deviceType,逻辑直观且和设备设置绑定:
@Builder public class User { private String userName; private String email; private String device; private String deviceType; // 重写Builder的device方法,自动设置deviceType public static class UserBuilder { public UserBuilder device(String device) { this.device = device; // 设备类型映射逻辑,注意用equals或switch,别用==比较字符串 switch (device) { case "iPhone": this.deviceType = "mobile"; break; case "Kindle": this.deviceType = "tablet"; break; // 可添加更多设备类型映射 default: this.deviceType = "unknown"; break; } return this; } } }
使用时还是原来的写法,完全不用管deviceType:
User user = User.builder() .userName("sample-username") .email("sample-email") .device("iPhone") .build(); // 此时user.getDeviceType()就是"mobile"
方式二:在全参构造器中处理映射
把设备类型的映射逻辑放在构造器里,确保对象创建时就完成初始化,还能避免外部手动设置deviceType:
@Builder public class User { private String userName; private String email; private String device; private String deviceType; // 全参构造器,自动根据device生成deviceType public User(String userName, String email, String device, String deviceType) { this.userName = userName; this.email = email; this.device = device; // 忽略传入的deviceType,用device自动计算 this.deviceType = mapDeviceToType(device); } // 把映射逻辑抽成单独方法,方便维护 private String mapDeviceToType(String device) { if (device == null) { return "unknown"; } return switch (device) { case "iPhone" -> "mobile"; case "Kindle" -> "tablet"; // 其他设备类型 default -> "unknown"; }; } // 可选:隐藏deviceType的设置方法,防止外部手动修改 public static class UserBuilder { public UserBuilder deviceType(String deviceType) { // 直接忽略调用,或者抛出异常禁止手动设置 return this; } } }
方式三:重写Builder的build方法
在最终构建对象时统一计算deviceType,适合device可能被多次修改的场景:
@Builder public class User { private String userName; private String email; private String device; private String deviceType; public static class UserBuilder { @Override public User build() { // 构建前计算deviceType this.deviceType = mapDeviceToType(this.device); return super.build(); } private String mapDeviceToType(String device) { if (device == null) { return "unknown"; } switch (device) { case "iPhone": return "mobile"; case "Kindle": return "tablet"; default: return "unknown"; } } } }
内容的提问来源于stack exchange,提问作者ragingDino
相关产品推荐
相关产品推荐

