有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重构模式匹配序列

我有以下一段代码(示例缩短):

while (reader.ready()) {
    String line = reader.readLine();

    Matcher responseCodeMatcher = responseCodePattern.matcher(line); 
    if (responseCodeMatcher.matches()) {
        responseCode = Integer.parseInt(responseCodeMatcher.group(1));
        continue;
    }

    Matcher cacheControlMatcher = cacheControlPattern.matcher(line); 
    if (cacheControlMatcher.matches()) {
        cacheControl = CacheControl.parseString(responseCodeMatcher.group(1));
        continue;
    }

        ...

}

这些模式都是该类的静态最终成员。 所以我有一系列的模式,我想找出每一行是否匹配其中一个,如果匹配,做点什么(从一个模式到另一个模式)。你能想出一个方法来很好地重构它吗?也许是我看过的一系列模式(如果匹配,我怎么知道该怎么做?)或者其他想法


共 (1) 个答案

  1. # 1 楼答案

    我最终以以下方式进行重构。我创建了一个类HttpPatterns

    package cs236369.proxy.types;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public enum HttpPatterns {
        RESPONSE_CODE("^HTTP/1\\.1 (\\d+) .*$"),
        CACHE_CONTROL("^Cache-Control: (\\w+)$"),
        HOST("^Host: (\\w+)$"),
        REQUEST_HEADER("(GET|POST) ([^\\s]+) ([^\\s]+)$"),
        ACCEPT_ENCODING("^Accept-Encoding: .*$"),
        CONTENT_ENCODING("^Content-Encoding: ([^\\s]+)$");
    
        private final Pattern pattern;
    
        HttpPatterns(String regex) {
            pattern = Pattern.compile(regex);
        }
    
        public boolean matches(String expression) {
            return pattern.matcher(expression).matches();
        }
    
        public Object process(String expression) {
            Matcher matcher = pattern.matcher(expression);
            if (!matcher.matches()) {
                throw new RuntimeException("Called `process`, but the expression doesn't match. Call `matches` first.");
            }
    
            if (this == RESPONSE_CODE) {
                return Integer.parseInt(matcher.group(1));
            } else if (this == CACHE_CONTROL) {
                return CacheControl.parseString(matcher.group(1));
            } else if (this == HOST) {
                return matcher.group(1);
            } else if (this == REQUEST_HEADER) {
                return new RequestHeader(RequestType.parseString(matcher.group(1)), matcher.group(2), matcher.group(3));
            } else if (this == CONTENT_ENCODING) {
                return ContentEncoding.parseString(matcher.group(1));
            } else { //never happens
                return null;
            }
        }
    
    
    }
    

    我这样使用它:

    String line;
                while ((line = reader.readLine()) != null) {
    
                    if (HttpPatterns.CACHE_CONTROL.matches(line)) {
                        cacheControl = (CacheControl) HttpPatterns.RESPONSE_CODE.process(line);
                    } else if (HttpPatterns.REQUEST_HEADER.matches(line)) {
                        requestHeader = (RequestHeader) HttpPatterns.REQUEST_HEADER.process(line);
                    } else if (HttpPatterns.HOST.matches(line)) {
                        requestHost = (String) HttpPatterns.HOST.process(line);
                    } else if (HttpPatterns.ACCEPT_ENCODING.matches(line)) {
                        continue;
                    } else if (line.isEmpty()) {
                        break;
                    }
                    fullRequest += "\r\n" + line;
                }
    

    我不喜欢这样,我必须把我得到的一切都投进去,但这是迄今为止我找到的最好的解决方案