在多个 if 语句中调用正则表达式检查方法时使用哪种模式或方法?

Which pattern or method to use when calling a regex check method in multiple if statements?

我在 class 中创建了一个工厂模式。

在这个 class 中,我注入了 classes,它根据传入的 String 参数实现了 Command 接口。

工厂class

@Component
@RequiredArgsConstructor
public class CommandFactory {
    private final ACommand aCommand;
    private final BCommand bCommand;
    private final CCommand cCommand;
    private final DCommand dCommand;
    private final ECommand eCommand;
    private final FCommand fCommand;

    public Command createCommand(String content) {
        if (aCommand.isMatching(content)) {
            return aCommand;
        } else if (bCommand.isMatching(content)) {
            return bCommand;
        } else if (cCommand.isMatching(content)) {
            return cCommand;
        } else if (dCommand.isMatching(content)) {
            return dCommand;
        } else if (eCommand.isMatching(content)) {
            return eCommand;
        } else if (fCommand.isMatching(content)) {
            return fCommand;
        } else {
            return null;
        }
    }

isMatching() 方法中有不同的正则表达式,我试图弄清楚应该如何处理这个传入的字符串。

我正在寻找一种更简洁的方法来摆脱这些连续的 if 语句。因为每当我在这个工厂中创建一个新的 class 时,我都会添加另一个 if 语句。

也许Stream可以帮忙?

Stream<Command> stream = Stream.of(aCommand, bCommand, cCommand ...);
return stream.filter(x -> x.isMatching(content)).findFirst().orElse(null);

现在每次添加新的 class 时,您只需在第一行添加一个新对象。

如果你想摆脱连续的 if 语句,你可以使用流(如用户 建议的)或循环,我也建议 return 和可选的,这使得 null 为客户处理得更清楚。

这里有两个建议的选项来摆脱 if else 重复,一个是循环,另一个是流:

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class CommandPatternExample {

    private List<Command> candidates = Arrays.asList(new ACommand(), new BCommand(), new CCommand());

    public Optional<Command> createCommand(String content) {
        for(Command command : candidates) {
            if(command.isMatching(content)) {
                return Optional.of(command);
            }
        }
        return Optional.empty();
    }

    public Optional<Command> createCommandStream(String content) {
        return candidates.stream().filter(c -> c.isMatching(content)).findFirst();
    }
}

interface Command<T> {
    void execute(T obj);
    boolean isMatching(String s);
}

class ACommand implements Command<String> {

    @Override
    public void execute(String obj) {

    }

    @Override
    public boolean isMatching(String s) {
        return "A".equals(s);
    }
}

class BCommand implements Command<String> {

    @Override
    public void execute(String obj) {

    }

    @Override
    public boolean isMatching(String s) {
        return "B".equals(s);
    }
}

class CCommand implements Command<String> {

    @Override
    public void execute(String obj) {

    }

    @Override
    public boolean isMatching(String s) {
        return "C".equals(s);
    }
}

地图可能是个好主意。这意味着如果您将命令实例作为值放入映射中,您的键将是可以与传入字符串匹配的值。然后,您可以获得更好的性能 O(1),而不是使用效率 O(n) 的顺序搜索。这是一个简短的回答。

除此之外还有一个开源 java 库 MgntUtils(由我编写),其中包含一些名为 "Self-instantiating factories" 的实用程序,基本上它为您管理和工厂。您需要做的就是创建一个实现特定接口的 class,该实用程序会为您将其添加到基于地图的工厂中。它可能对你有用。这是一篇文章的 link,解释了库中的实用程序以及从何处获取库(Github 和 Maven 中心)。在文章中查找段落“生命周期管理(自实例化工厂)”。该库还附带了详细的书面 java 文档和该功能的代码示例。