【问题标题】:Java import all from allJava 全部导入
【发布时间】:2013-10-18 19:23:41
【问题描述】:

我有一个合乎逻辑的问题:为什么我不能从 java 中的所有包中导入所有包? 例如,我可以从 java.awt 导入所有类:

import java.awt.*;

但以下是不可能的:

import java.awt.*.*;

我的目标是从 awt.image 和 awt.event 等导入所有东西。 有没有其他方法可以做到这一点?

谢谢!

【问题讨论】:

  • 也许是因为这通常是一件坏事?坦率地说,* 运算符的存在是 Java 中的一个设计缺陷。你应该只导入你实际使用的类
  • 我们必须更改编译器才能使其工作。目前还不能。
  • 我猜冲突太多了。如果您导入所有内容,则必然有超过 1 个类被命名两次。它会像疯了一样导致模棱两可。不过只是预感。
  • 让我们说詹姆斯高斯林不喜欢。
  • Java 导入的目的是只考虑必需的,但不像包含在 c、c++ 中那样全部考虑。

标签: java import packages


【解决方案1】:

没有办法在 Java 中实现import a.package.*.*;JLS, Section 7.5 指定了仅有的 4 种合法的导入类型:

单一类型导入声明(第 7.5.1 节)导入单一命名类型, 通过提及其规范名称(§6.7)。

例如import java.util.List;

按需类型导入声明(第 7.5.2 节)导入所有 根据需要,命名类型或命名包的可访问类型(第 6.6 节),通过 提及类型或包的规范名称。

例如import java.awt.*;

单一静态导入声明(第 7.5.3 节)导入所有可访问的 类型中具有给定名称的静态成员,通过给出其规范 名字。

例如import static org.junit.Assert.assertEquals;

按需静态导入声明(第 7.5.4 节)导入所有可访问的 根据需要命名类型的静态成员,通过提及规范 类型的名称。

例如import static org.junit.Assert.*;

包允许单独引用同名的类。例如。有java.awt.Listjava.util.List。什么会阻止某人使用java.*.*; 导入所有内容。那么List 将如何解决呢?会有太多的歧义。

【讨论】:

  • 你让歧义看起来是闻所未闻的,甚至是不允许的。这实际上是相当普遍的。我在同一个类中多次看到 java.util.Date 和 java.sql.Date 。使用完整的包名解决了歧义。理论上,如果 Java 允许这样的事情,这同样适用于此。
  • 其实这种歧义是不允许的。尝试导入java.awt.Listjava.util.List,你会得到一个编译器错误。您是对的,在实际代码中使用完全限定的类名指定 java.util.List 可以消除歧义。但是这样做完全不需要导入。
  • 在导入语句级别,是的。听起来你在说同名的类不能存在于同一个文件中。顺便说一句,您是如何在评论中获得代码格式的?还在这里学习。
  • @Vidya 这并非闻所未闻,但正如您所说,您必须自己应对。如果您被允许执行“import java.*”并且会递归地导入所有内容,那么编译器会出现错误,因为它会尝试从不同的包中导入 2x List。他们需要为此添加解决机制,或者在出现歧义时禁止此类导入(那将不是一个有用的功能,恕我直言)。
  • @Vidya 环绕代码以使用反引号进行格式化。例如。 `test` 产生test
【解决方案2】:

不,使用通配符导入通常是不好的风格,因为它会使您的代码更难阅读。

【讨论】:

  • 不一定。有时它实际上使它更具可读性,因为您有 1 个导入而不是 50 个。尽管大多数 IDE 无论如何都会折叠该列表。
  • 我必须同意 AFS,而且随着 Eclipse 等 IDE 的出现,无论如何它都会折叠它们。如果你有这么多的导入,你很可能违反了内聚原则并且在你的类中做了很多事情。
  • 这只是一个夸张的例子......通配符不会降低您的代码的可读性,也不会使其变慢。唯一的问题可能是命名空间冲突——这可能会导致代码有点混乱,因为您必须使用完全限定的类名。但话又说回来,当您实际上必须使用 2 个具有相同名称的类时,情况也是如此......
  • 如果你真的想读代码,你从类开始而不是从导入开始。
【解决方案3】:

使用通配符导入的一些缺点:

  1. 导致包含您可能根本不使用的类。不清楚您正在使用什么。
  2. 范围更广,这被认为是不好的编程习惯。
  3. 最重要的可能会导致命名空间冲突。如果您公然从两个包中导入所有内容,则可能会导致来自不同包的两个具有相同名称的类之间发生冲突。

编辑:似乎导入比要求更多的类不会导致任何庞大的代码,但我仍然希望明确导入类以清楚地了解我正在使用什么。

【讨论】:

  • 再一次......您导入但未使用的类最终不会以任何方式加载或包含。
猜你喜欢
  • 1970-01-01
  • 2022-11-12
  • 2013-08-22
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 2012-02-27
相关资源
最近更新 更多