9

我一直在阅读 Josh Bloch 的“Effective Java 2nd Edition”。第 43 项声明“返回空数组或集合,而不是空值”。我的问题是如何搜索项目中返回 java.util.Collection 接口实现的所有方法?使用的 IDE 是 Eclipse,但任何找到正确结果的方法都是可以接受的,例如正则表达式或其他一些 IDE。

4

8 回答 8

11

在 Eclipse 帮助中找到了这个:

要搜索具有特定返回类型的方法,请使用“*”,如下所示:

  1. 打开搜索对话框并单击 Java 搜索选项卡。
  2. 在搜索字符串中键入“*”和返回类型,以空格分隔。
  3. 选择区分大小写复选框。
  4. 选择方法和声明,然后单击搜索。

它可以帮助查找返回特定类型但不返回某些接口的实现的所有方法。

于 2009-04-13T15:00:01.503 回答
5

感谢您提及 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 的首席执行官]

于 2009-04-18T13:49:58.913 回答
4

在 IntelliJ IDEA 调用结构搜索中,选择现有模板“类的方法”。该操作将添加以下模板:

类$类$ {
  $ReturnType$ $MethodName$($ParameterType$ $Parameter$);
}

将“ReturnType”变量(编辑变量操作)的文本约束设置为 java.util.Collection,指定“在层次结构内应用约束”以搜索后代。对于“MethodName”变量,指定它是搜索的目标。那开始搜索,享受:)

于 2009-06-11T15:54:05.160 回答
1

我不知道有一种方法可以找到返回类型是java.util.Collection 的任意实现的所有方法(包括您可以自己定义的方法)

如果您可以接受更有限的解决方案,那么会想到一些可能性:

  1. 转到任何导入 java.util.Collection 的类,双击“Collection”,右键单击“Collection”,然后选择“References > Project”。

  2. 对于任何特定的感兴趣的集合类型也是如此。

  3. 转到返回集合类型的任何方法,双击其返回类型,然后按上述方法搜索该类型。

  4. 转到导入任何 java.util 的任何类。任何东西,拖过“java.util”。省略该包前缀之后的类,然后右键单击搜索项目引用,如上所述。

对于上述所有内容,“搜索”视图将向您显示项目中出现所选项目的位置的可展开轮廓。您可以遍历该轮廓(使用键盘 - 使用 Enter 选择 - 或鼠标 - 单击选择)以检查这些使用的位置。我看不到将查看的引用限制为“方法返回类型”的方法,但至少您可以快速移动到代码中的相关位置,以关注感兴趣的特定使用类型。

(有了所有这些,您可以单击“搜索”选项卡顶部的小向下三角形并过滤要包含在显示中的使用类型,例如排除导入语句。)

于 2009-02-25T10:25:05.490 回答
1

插件时间!我做了一个可以完成大部分工作的东西......

http://javadude.com/misc/collectionmarker.zip

http://javadude.com/misc/collectionmarker-source.zip(如果有兴趣)

将collectionmarker.zip 解压缩到你的eclipse 目录中(你的eclipse 目录应该包含一个plugins 目录)

重启日食

工具栏上会有两个小 Eclipse 图标 - 一个清除标记,一个添加标记。

该插件搜索您工作区中的所有内容;它忽略选择。(它又快又脏)

希望这可以帮助!——斯科特

于 2009-02-25T17:09:52.707 回答
0

如果现有的用户界面没有办法做到这一点,您总是可以使用反射来遍历代码。这不是很多工作,几个嵌套循环。

于 2009-02-25T10:02:27.710 回答
0

intellij IDEA 具有基于结构/表达式的搜索,因此通过搜索所有返回 Collection 的方法,您至少可以得到一些接近的结果。

于 2009-02-25T10:13:49.040 回答
0

如果您的 IDE 不支持结构搜索, PMD可以检查这一点,SemmleCode也可以。

于 2009-04-13T16:28:46.687 回答