使用 lombok builder + Switch 语句以获得更清晰代码的更好方法

Better approaches to use lombok builder + Switch statement for cleaner code

我正在尝试根据输入参数的类型构建对象。以下代码的问题在于,随着我向其中添加更多功能,它变得更加冗长。有没有什么方法可以使用 Hashmap 来简化这个,或者是否有任何其他 lombok 注释可以帮助在字符串和 Lombok 构建器对象之间进行映射?

        switch (functionType) {
            case "ABS":
                function = Abs.builder().argument(args).build();
                break;
            case "SUM":
                function = Sum.builder().argument(args).build();
                break;
            case "IF":
                function = IfThen.builder().argument(args).build();
                break;
            case "IFNA":
                function = IfNa.builder().argument(args).build();
                break;

        }

你本质上需要的是一个工厂class。最重要的是,我认为您不需要在这种情况下使用 lombok。假设您的对象只需要传入 args 参数,请查看以下内容:

public class FunctionFactory {

    private static final Map<String, Function<List<String>, BaseFunction>> SUPPLIER_MAP = Map.of(
        "ABS", Abs::new,
        "SUM", Sum::new,
        "IF", IfThen::new,
        "IFNA", IfNa::new
    );

    public static BaseFunction getImplementation(String functionType, List<String> args) {
        return SUPPLIER_MAP
            .entrySet()
            .stream()
            .filter(entrySet -> entrySet.getKey().equals(functionType))
            .findAny()
            .map(Map.Entry::getValue)
            .map(function -> function.apply(args))
            .orElseThrow(() -> new IllegalStateException(String.format("Cannot find suitable implementation for type %s", functionType)));
    }

}

这实际上是创建一个映射的静态映射,将您的 functionType(应该是 Enum 映射到抽象 [=14= 的每个具体实现的构造函数] class。有了那个地方,您只需调用 getImplementation 即可遍历映射,根据输入值测试键并检索适当的构造函数。

我希望这可以帮助您开始重构您的代码。