0

在我们的代码库中,我正在寻找给定类的匿名子类,它们实现了一种特定方法并且没有其他方法或字段。这些可以转换为 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", /*...*/);
    }
});

有没有办法在搜索/替换对话框中表达“没有其他方法”?

目前,我只看到在“查找”视图中检查每个命中并删除不需要的命中并替换其余命中的方法。由于我们需要多次应用这种重构和类似重构(例如,处理并发编写的新代码),这变得相当费力。

4

1 回答 1

1

您可以使用这样的搜索模板:

new SimpleListSubstitution<$Type$>() {
    @Override
    protected Iterable<$Type$> getItems() {
        return $EXPRESSION$;
    }
    $ReturnType$ $Method$($ParameterType$ $Parameter$);
}

使用以下变量设置:
Method最小值:0,最大值:0
Parameter最小值:0,最大值:无限制

请注意,此模式尝试匹配其他方法,但由于Method设置为0出现,如果找到方法,匹配将失败。这样,只有没有定义附加方法的类才会出现在搜索结果中。

于 2017-06-19T11:37:28.817 回答