在我们的代码库中,我正在寻找给定类的匿名子类,这些子类实现一种特定方法并且没有其他方法或字段。这些可以转换为 lambda 表达式,并消除对该匿名子类的需求。
我想出的搜索模板如下所示:
new SimpleListSubstitution<$Type$>() {
@Modifier Iterable<$Type$> getItems() {
return $EXPRESSION$;
}
}
替换模板如下:
SimpleListSubstitution.forItems(() -> $EXPRESSION$)
现在这个表达式找到我要重构的所有实例,但除此之外,它还找到了也实现其他方法(帮助程序方法或从超类重写)的子类。
例如,我希望它在此代码中找到子类:
template.put("pathToRoot", new SimpleListSubstitution<Page>() {
@Override
protected Iterable<Page> getItems() {
return listOfPagesToRoot;
}
});
这将转换为以下内容:
template.put("pathToRoot", SimpleListSubstitution.forItems(() -> listOfPagesToRoot));
但是由于额外的putAdditionalSubstitutions
方法,我确实希望它不会在此代码中找到子类:
template.put("children", new SimpleListSubstitution<Page>() {
@Override
protected Iterable<Page> getItems() {
return getChildren(page, booleanFeatureName);
}
@Override
protected void putAdditionalSubstitutions(Template template) {
template.put("link", /*...*/);
}
});
有没有办法在搜索/替换对话框中表达"没有其他方法"?
目前,我只看到在"查找"视图中检查每个命中并删除不需要的命中并替换其余命中的方法。由于我们需要多次应用此重构和类似的重构(例如,处理并发编写的新代码),因此这变得非常费力。
您可以使用如下搜索模板:
new SimpleListSubstitution<$Type$>() {
@Override
protected Iterable<$Type$> getItems() {
return $EXPRESSION$;
}
$ReturnType$ $Method$($ParameterType$ $Parameter$);
}
使用以下变量设置:
最小Method
:0,最大值:0Parameter
最小值:0,最大值:无限制
请注意,此模式尝试匹配其他方法,但由于Method
设置为0
出现次数,因此如果找到方法,匹配将失败。这样,只有未定义其他方法的类才会出现在搜索结果中。