我一直在阅读 Josh Bloch 的“Effective Java 2nd Edition”。第 43 项声明“返回空数组或集合,而不是空值”。我的问题是如何搜索项目中返回 java.util.Collection 接口实现的所有方法?使用的 IDE 是 Eclipse,但任何找到正确结果的方法都是可以接受的,例如正则表达式或其他一些 IDE。
8 回答
在 Eclipse 帮助中找到了这个:
要搜索具有特定返回类型的方法,请使用“*”,如下所示:
- 打开搜索对话框并单击 Java 搜索选项卡。
- 在搜索字符串中键入“*”和返回类型,以空格分隔。
- 选择区分大小写复选框。
- 选择方法和声明,然后单击搜索。
它可以帮助查找返回特定类型但不返回某些接口的实现的所有方法。
感谢您提及 SemmleCode。要查找源中返回 java.util.Collection 子类型的所有方法,请编写:
import default
class CollectionType extends RefType {
CollectionType() {
this.getASupertype*().hasQualifiedName("java.util","Collection")
}
}
from Method m
where m.getType() instanceof CollectionType
and
m.fromSource()
select m
也就是说,我们首先定义 CollectionType 的含义:所有以 java.util.Collection 作为超类型的类型。getASupertype 后面有一颗星,因为我们想应用该操作零次或多次。接下来我们只选择返回类型是这样一个 CollectionType 并且出现在源中的那些方法。
继续,试试看 :-) 这是一个简单的练习,可以将查询进一步细化为那些应该返回 CollectionType 但可能返回 null 的方法。所有这些都可以交互完成,在您开发查询时自动完成,并持续检查以帮助您正确完成。您可以通过多种不同方式查看结果,并轻松在分析结果和代码之间导航。
-Oege [披露:我是 Semmle 的首席执行官]
在 IntelliJ IDEA 调用结构搜索中,选择现有模板“类的方法”。该操作将添加以下模板:
类$类$ { $ReturnType$ $MethodName$($ParameterType$ $Parameter$); }
将“ReturnType”变量(编辑变量操作)的文本约束设置为 java.util.Collection,指定“在层次结构内应用约束”以搜索后代。对于“MethodName”变量,指定它是搜索的目标。那开始搜索,享受:)
我不知道有一种方法可以找到返回类型是java.util.Collection 的任意实现的所有方法(包括您可以自己定义的方法)。
如果您可以接受更有限的解决方案,那么会想到一些可能性:
转到任何导入 java.util.Collection 的类,双击“Collection”,右键单击“Collection”,然后选择“References > Project”。
对于任何特定的感兴趣的集合类型也是如此。
转到返回集合类型的任何方法,双击其返回类型,然后按上述方法搜索该类型。
转到导入任何 java.util 的任何类。任何东西,拖过“java.util”。省略该包前缀之后的类,然后右键单击搜索项目引用,如上所述。
对于上述所有内容,“搜索”视图将向您显示项目中出现所选项目的位置的可展开轮廓。您可以遍历该轮廓(使用键盘 - 使用 Enter 选择 - 或鼠标 - 单击选择)以检查这些使用的位置。我看不到将查看的引用限制为“方法返回类型”的方法,但至少您可以快速移动到代码中的相关位置,以关注感兴趣的特定使用类型。
(有了所有这些,您可以单击“搜索”选项卡顶部的小向下三角形并过滤要包含在显示中的使用类型,例如排除导入语句。)
插件时间!我做了一个可以完成大部分工作的东西......
抓
http://javadude.com/misc/collectionmarker.zip
http://javadude.com/misc/collectionmarker-source.zip(如果有兴趣)
将collectionmarker.zip 解压缩到你的eclipse 目录中(你的eclipse 目录应该包含一个plugins 目录)
重启日食
工具栏上会有两个小 Eclipse 图标 - 一个清除标记,一个添加标记。
该插件搜索您工作区中的所有内容;它忽略选择。(它又快又脏)
希望这可以帮助!——斯科特
如果现有的用户界面没有办法做到这一点,您总是可以使用反射来遍历代码。这不是很多工作,几个嵌套循环。
intellij IDEA 具有基于结构/表达式的搜索,因此通过搜索所有返回 Collection 的方法,您至少可以得到一些接近的结果。
如果您的 IDE 不支持结构搜索, PMD可以检查这一点,SemmleCode也可以。