【问题标题】:Does an import wildcard import everything all the time?导入通配符是否一直导入所有内容?
【发布时间】:2012-12-08 11:16:06
【问题描述】:

我正在编写一个小型 Java 程序并使用数组,所以我已经完成了:

import java.util.Arrays;

后来我开始扩展我之前所做的工作,并决定我想从用户那里获得意见,所以当时我补充说:

import java.util.Scanner;

现在发生了一个想法。我知道我可以这样做:

import java.util.*

然后我只需要 1 个导入行而不是两个(或者我最终需要多少行),但是导入中的通配符是否意味着它将从该包中导入 所有内容,而不管是否需要,还是只会拉取选择性功能?

我的直觉是编写更多代码,并且只包含我知道我需要的包,但如果这没有什么不同,为什么有人会导入更多的关卡/包然后他们需要呢? (我宁愿偷懒,少写代码)

【问题讨论】:

  • @NuclearGhost - 感谢您的链接,所以(回答问题的后半部分)听起来明确命名要导入的包/类很有用,以防出现命名冲突。这是那个线程的想法吗?
  • 确实如此。从长远来看,它还使事情更易于维护。未来的开发者会从包中准确地知道你使用的是哪个类

标签: java import wildcard packages


【解决方案1】:

清楚 import 的作用。这并不意味着加载.class 文件和字节码。

所有导入功能都允许您通过使用短类名来节省输入。

因此,如果您在代码中使用java.sql.PreparedStatement,则在导入java.sql.PreparedStatement 时可以使用PreparedStatement。您可以永远编写 Java 代码,而无需使用单个 import 语句。您只需拼出所有完全解析的类名。

并且类加载器在运行时首次使用时仍会从.class 文件中引入字节码。

它可以节省您的击键次数。就是这样。

它与类加载无关

就个人而言,我更喜欢避免使用 * 符号。我拼出每一个进口。我认为它更好地记录了我的意图。我的 IDE 是 IntelliJ,所以我要求它即时插入导入。

对于开发人员来说,懒惰通常是一种美德,但在这种情况下并非如此。把它们拼出来,让你的 IDE 为你单独插入它们。

如果你输入

import java.util.*;

您可以通过它们的简称来引用 ScannerList

但如果你想对 FutureTaskLinkedBlockingQueue 做同样的事情,你必须有这个:

import java.util.concurrent.*;

【讨论】:

  • 好的,这就是我想问的。我没有正确的“java”术语。因此,是否使用通配符(从最终的包大小)并不重要,因为它没有加载导入的类。只是在使用时需要小心,以防命名冲突。那个?
  • +1,import#include 不同。它所做的只是让编译器正确地解决所有问题。拥有import 语句不会导致类实际被加载。 JLS §12.4.1 中概述了类实际加载 的唯一情况。请注意,任何地方都没有提到导入。
  • “链接”这个词让我想到了链接 C/C++。我不认为你是那个意思。我不会使用“编译器正确链接所有内容”这个短语。正如我所说:短名称而不是完全解析的名称。就是这样。
  • Spell them out and have your IDE insert them for you individually 是的,我的“IDE”是 gedit 和 javac,所以没有自动完成对我来说......我想我应该改变它
  • IntelliJ 今天有一场玛雅天启特卖,因此您可以以便宜的价格买到市场上最好的 IDE。或者免费使用社区版:jetbrains.com
【解决方案2】:

通配符会导入该包中的所有内容。但是,使用 Eclipse 之类的 IDE,它为您提供了组织导入的可能性。

【讨论】:

    【解决方案3】:

    通配符导入该包中的所有类和接口。

    但是,通配符导入不会导入以相同名称开头的其他包。

    例如,导入 java.xml.* 不会导入 java.xml.bind 包。

    【讨论】:

    • 呃...对不起,我不关注...import java.xml.* 不给你java.xml.bind 功能?我认为这是* 的重点,因此您不必明确要求个别的。就像在我的示例中一样,问题中有java.utils
    • 我更新了我的答案以澄清。 * 导入包中的所有类和接口。 * 不做的是导入其他包。在您的问题中, java.util.Scanner 是一个类,而不是一个包。
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2016-06-03
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多