【问题标题】:Java: Where is the method?Java:方法在哪里?
【发布时间】:2016-03-02 10:49:54
【问题描述】:

我只是尝试通过阅读源代码来理解 api 的一些代码。这是一个链接:

https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/browse/src/main/java/org/bukkit/configuration/MemorySection.java

在这个类中你可以找到方法public int getInt(String path, int def)。此方法调用toInt(val)。我在哪里可以找到这种方法。由于没有指定对象或类,例如anObject.toInt(val)ClassName.toInt(val),因此必须在该类或超类中定义该方法,但我找不到它。

我的问题:那是原始来源吗?你能找到吗?它在哪里?

【问题讨论】:

  • 这是使用现代 IDE 的一个很好的理由。它们允许您“点击”方法调用,省去了查找它们定义位置的麻烦。 (您仍然应该了解什么是静态导入以及它们是如何工作的,但是当一个文件中有 15 个静态导入时,您真的不想通过它们中的每一个来查找您的方法。)
  • 尽管文件中有 15 个通配符静态导入,但可能是时候重新考虑了。 :)
  • @biziclop 到目前为止,我什至没有听说过静态导入。我自学了java,我总是试图理解我在做什么。现在我也了解了静态导入的工作原理。反正我不会用它们。感谢所有回答我问题的人!

标签: java class methods call superclass


【解决方案1】:

toInt() 方法来自 org.bukkit.util.NumberConversions 类。

现在,为什么没有指定类以及它如何工作?如果您查看文件顶部的导入,您会看到:

import static org.bukkit.util.NumberConversions.*;

这基本上意味着

为我提供org.bukkit.util.NumberConversions 类中的任何公共静态方法。

当您想让代码更简洁时,这是 Java 的一个有用功能。但是,由于负责此方法的类并不是很明显,因此最好仅将其用于广泛用户的辅助方法,例如此处的toInt

另一个典型的例子是 JUnit 断言。甚至还解释了in their javadoc

这些方法可以直接使用:Assert.assertEquals(...),但是如果通过静态导入来引用它们会更好读:

import static org.junit.Assert.*;
   ...
    assertEquals(...);

【讨论】:

    【解决方案2】:

    你可以在java文件的第一行找到一个带static的import语句(就是静态导入,只导入类的方法)。

    import static org.bukkit.util.NumberConversions.*;
    

    您可以在link 中找到该方法。只需遍历类并搜索即可。

    【讨论】:

    • 谢谢!我不知道静态导入。
    • 这就是为什么通配符导入是废话,需要避免。
    • @Tom “明智地使用”可能是一个更合适的短语。它们有它们的用途,但非常有限。
    • @biziclop 那应该是什么用途?
    • @Tom 例如导入枚举的所有值。或者上面给出的Assert.* 案例。