在我们的代码库中,我正在寻找给定类的匿名子类,它们实现了一种特定方法并且没有其他方法或字段。这些可以转换为 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", /*...*/);
}
});
有没有办法在搜索/替换对话框中表达“没有其他方法”?
目前,我只看到在“查找”视图中检查每个命中并删除不需要的命中并替换其余命中的方法。由于我们需要多次应用这种重构和类似重构(例如,处理并发编写的新代码),这变得相当费力。