【问题标题】:How to find usages of ONE implementation of an interface's method如何找到接口方法的 ONE 实现的用法
【发布时间】:2019-10-08 16:23:19
【问题描述】:

我有一个包含数百个接口实现的项目。我想在该接口的一个实现中找到方法的用法。 Intellij(和 Eclipse)都向我展示了该方法在所有实现中的所有用法 - 数百种。

我在界面的一个实现中突出显示该方法,右键单击并选择“查找用法”,它会显示该方法在所有实现中的所有用法。

Intellij 中的所有使用选项似乎都没有让我得到一个实现。

public interface Dog {
    void bark(int volume);
}
public class Lab implements Dog {
    public void bark(int volume) {
        System.out.println("woof");
    }
}
public class Collie implements Dog {
    public void bark(int volume) {
        System.out.println("woof");
    }
}
public class Main {

    public static void main(String[] args) {
        Dog onyx = new Lab();
        Dog lassie = new Collie();


        onyx.bark(50);
        lassie.bark(20);
    }
}

如果我突出显示 Lab bark 方法,单击 show usages,我只想查看 main.java 中的 onyx.bark(50) 行,而不是 main.java 中的两个 bark 用法。

我意识到,如果我在主类中使用 Lab onyx = new Lab() 和 Collie lassie = new Collie(),find references 将起作用,但这不是项目的编写方式。当类型是接口时,IDE可能无法确定实现类,但它肯定会有用。

【问题讨论】:

  • 很棒的问题。我通常会单步调试调试器以找出当时正在使用的实现,但必须有更好的方法来做到这一点。
  • 嗯,接口的重点是能够在运行时将一个实现交换为另一个实现。您的示例非常简单,似乎 IDE 应该能够“知道”onyxlassie 的实际类型,但考虑一个更复杂的场景:如果某些库、反射代码等会发生变化怎么办那些参考? IDE 如何知道在运行时会调用哪个?这是一项相当困难的任务(至少对于任意代码而言),因此 IDE 将向您展示 可能 最终调用该单个实现的所有用法。
  • 为了说明 Thomas 的观点:想象一个方法 public static void barkTwice(Dog dog)。 IDE 如何知道哪个实现作为参数传递?
  • 是的 - 我想不出 IDE 可以在运行时知道类型是什么的方法,但我认为它可能会根据它在 main 中的分配方式进行猜测。我想我可以搜索“= new Lab()”或构造函数本身的实例,但我正在使用的实际项目使用 spring - 所以没有使用任何明显的构造函数。通过 items.xml 搜索应该可以,但仍然不容易。

标签: java intellij-idea


【解决方案1】:

正如 cmets 所说,正在使用的实现是在运行时确定的,因此 Intellij 不能将使用结果限制为一种实现。但是,Intellij 支持建议创建自定义范围来限制使用搜索。这有点帮助,尽管创建一个范围需要您知道您使用的一般区域,这可能是您首先进行使用搜索的内容。就我而言,我可以创建一个仅包含我们公司为项目编写的代码的范围。这将结果从 500+ 减少到大约 80。

要在 Intellij 中创建自定义范围,请选择 File-settings-appearance & behavior-Scopes。单击对话框中间的加号,选择本地或共享,并为其命名。在对话框的右半部分,可以包含/排除/递归包含/排除递归库、包等。

然后,当您进行查找用法(或其他搜索)时,单击结果中的齿轮图标并在下拉列表中选择您的新范围。

【讨论】:

  • 你能把“公司说”的地方链接起来吗?我想阅读完整的推理......在我看来,IDEA 不仅有(编译的、类型擦除的)“类”,而且 IDEA 也有“来源”。所以,它应该是可行的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2014-12-06
  • 2018-09-07
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
相关资源
最近更新 更多