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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:35:24