如何提高代码质量,以查看字符串是否与正则表达式的Java中的任何一个匹配

时间:2016-09-29 05:44:30

标签: java regex if-statement optimization

在我的一个项目中,我需要将URI与几种正则表达式模式(15种正则表达式模式)进行比较。目前我使用了一个if梯子来查看它们中的任何一个是否匹配,然后执行代码的逻辑部分。

现在看一下代码:

{{1}}

有人可以用更简洁明智的方式向我介绍这个正则表达式匹配的东西吗?

2 个答案:

答案 0 :(得分:2)

一个url-type(正则表达式)=一个处理程序=一个类。这种方式更容易阅读和支持,特别是如果你有15个正则表达式检查。

interface URLHandler {
    void handle();
    boolean isSupported(String url);
}

class GetAllApisStoreHandler implements URLHandler{
    private static final Pattern GET_ALL_API_STORE_PATTERN = Pattern.compile(GET_ALL_APIS_STORE_REGEX);

    public boolean isSupported(String url) {
        return GET_ALL_API_STORE_PATTERN.matcher(url).matches();
    }

    public void handle(...) {
        ...
    }
}

class GetApiIdHandler implements URLHandler{
    private static final Pattern GET_API_ID_REGEX = Pattern.compile(GET_API_ID_REGEX);

    public boolean isSupported(String url) {
        return GET_API_ID_PATTERN.matcher(url).matches();
    }

    public void handle(...) {
        ...
    }
}

class GetApiIdHandler implements URLHandler{
    private static final Pattern GET_SWAGGER_FORAPI_ID_PATTERN = Pattern.compile(GET_SWAGGER_FOR_API_ID_REGEX);

    public boolean isSupported(String url) {
        return GET_SWAGGER_FORAPI_ID_PATTERN.matcher(url).matches();
    }

    public void handle(...) {
        ...
    }
}

class Main {
    private List<URLHandler> urlHandlers;

    public void method(){
        ...
        for (URLHandler handler : urlHandlers) {
            if(handler.isSupported(url)) {
               handler.handle(arg1, arg2, arg3, ...); 
            }
        }
        ...
    }
}

答案 1 :(得分:1)

使用@KonstantinLabun提出的多个类可能是要走的路(*),但它不应该导致很多代码重复。因此,使用抽象类而不是(或除了接口)。或者(误)使用默认方法。

abstract class URLHandler {
    abstract void handle();
    abstract Pattern urlPattern():
    final boolean isSupported(String url) {
        return urlPattern().matcher(url).matches();
    }
}

class GetAllApisStoreHandler extends URLHandler{
    private static final Pattern URL_PATTERN =
        Pattern.compile(Constants.GET_ALL_APIS_STORE_REGEX);

    Pattern urlPattern() {
         return URL_PATTERN;
    }

    public void handle(...) {
        ...
    }
}

由于其范围已经确定,因此无需为PATTERN创建名称。静态字段仅作为优化存在,因此{}不会为每次匹配编译{/ 1}}。

(*)单个课程没有任何问题,只要它简洁(除了代码之外我喜欢意大利面条)并且没有泄漏实施细节。多个类没有任何问题(除了可能在Android上,因为每个类50 kB可能很重要),只要它们不会导致代码膨胀。 Pattern有时也是一个很好的解决方案。

抽象类与接口的解释

界面强制您实现其方法(**),这可能很快导致重复。它的优点是多重继承和一些概念纯度。

抽象类允许您收集公共部分。但是没有两难选择,你可以做到这两点,例如,enuminterface List

(**)从Java 8开始,接口可以有默认方法,所以这不再是真的。假设您想将它们用于此目的。它不能声明任何状态,但它可以访问对象的状态。例如,我上面的abstract class AbstractList可能是这样的界面。还有一些缺点,例如,方法必须URLHandler且不能public