有 Java 编程相关的问题?

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

java避免代码重复

考虑下面的代码:

if (matcher1.find()) {
   String str = line.substring(matcher1.start()+7,matcher1.end()-1);
   /*+7 and -1 indicate the prefix and suffix of the matcher... */    
   method1(str);
}
if (matcher2.find()) {
   String str = line.substring(matcher2.start()+8,matcher2.end()-1);
   method2(str);
}
...

我有n个匹配器,所有匹配器都是独立的(如果其中一个是真的,它不会说明其他匹配器…),对于每一个匹配器,这是真的——我对匹配的内容调用不同的方法。
问题:我不喜欢这里的代码复制和“神奇数字”,但我想知道是否有更好的方法来做。。。?(可能是访客模式?)有什么建议吗


共 (4) 个答案

  1. # 1 楼答案

    你可以把它缩短一点,但我的问题是,这真的值得努力吗:

    private String getStringFromMatcher(Matcher matcher, int magicNumber) {
       return line.subString(matcher.start() + magicNumber, matcher.end() - 1 )
    }
    
    if (matcher1.find()) {
    method1(getStringFromMatcher(matcher1, 7);
    }
    
    if (matcher2.find()) {
    method2.(getStringFromMatcher(mather2, 8);
    }
    
  2. # 2 楼答案

    简单标记要传递给带有捕获组的方法的正则表达式部分

    例如,如果您的正则表达式为foo.*bar,而您对foobar不感兴趣,则将正则表达式设置为foo(.*)bar。然后始终从Matcher中获取组1

    您的代码将如下所示:

    method1(matcher1.group(1));
    method2(matcher2.group(2));
    ...
    

    另一个步骤是用实现如下内容的类替换方法:

    public interface MatchingMethod {
      String getRegex();
      void apply(String result);
    }
    

    然后,您可以轻松地自动化任务:

    for (MatchingMethod mm : getAllMatchingMethods()) {
      Pattern p = Pattern.compile(mm.getRegex());
      Matcher m = p.matcher(input);
      while (m.find()) {
        mm.apply(m.group(1));
    }
    

    请注意,如果性能很重要,那么预编译Pattern可以改善运行时,如果您将其应用于许多输入

  3. # 3 楼答案

    将Cochard的解决方案与工厂(switch语句)与所有methodX方法结合使用。所以你可以这样称呼它:

    Factory.CallMethodX(myEnum.MethodX, str)
    

    您可以分配myEnum。Cochard解的布居步中的MethodX

  4. # 4 楼答案

    创建一个抽象类,并在子类中添加偏移量(根据您的需求,还可以使用字符串处理)

    然后将它们填充到列表中并处理该列表

    下面是一个示例abstract处理器:

    public abstract class AbsractProcessor {
    
        public void find(Pattern pattern, String line) {
            Matcher matcher = p.matcher(line);
            if (matcher.find()) {
                process(line.substring(matcher.start() + getStartOffset(), matcher.end() - getEndOffset()));
            }
        }
    
        protected abstract int getStartOffset();
    
        protected abstract int getEndOffset();
    
        protected abstract void process(String str);
    
    }