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个匹配器,所有匹配器都是独立的(如果其中一个是真的,它不会说明其他匹配器…),对于每一个匹配器,这是真的——我对匹配的内容调用不同的方法。
问题:我不喜欢这里的代码复制和“神奇数字”,但我想知道是否有更好的方法来做。。。?(可能是访客模式?)有什么建议吗
# 1 楼答案
你可以把它缩短一点,但我的问题是,这真的值得努力吗:
# 2 楼答案
简单标记要传递给带有捕获组的方法的正则表达式部分
例如,如果您的正则表达式为
foo.*bar
,而您对foo
或bar
不感兴趣,则将正则表达式设置为foo(.*)bar
。然后始终从Matcher
中获取组1您的代码将如下所示:
另一个步骤是用实现如下内容的类替换方法:
然后,您可以轻松地自动化任务:
请注意,如果性能很重要,那么预编译
Pattern
可以改善运行时,如果您将其应用于许多输入# 3 楼答案
将Cochard的解决方案与工厂(switch语句)与所有methodX方法结合使用。所以你可以这样称呼它:
您可以分配myEnum。Cochard解的布居步中的MethodX
# 4 楼答案
创建一个抽象类,并在子类中添加偏移量(根据您的需求,还可以使用字符串处理)
然后将它们填充到列表中并处理该列表
下面是一个示例abstract处理器: