使用单个语句更方便,更简洁,比如

import java.awt.*;

而不是导入一堆单独的类

import java.awt.Panel;
import java.awt.Graphics;
import java.awt.Canvas;
...

在import语句中使用通配符有什么问题?


当前回答

它使您的名称空间变得混乱,要求您完全指定任何有歧义的类名。最常见的情况是:

import java.util.*;
import java.awt.*;

...
List blah; // Ambiguous, needs to be qualified.

它还有助于使依赖项具体化,因为所有依赖项都列在文件的顶部。

其他回答

最重要的是导入java.awt。*可以使您的程序与未来的Java版本不兼容:

假设你有一个名为“ABC”的类,你使用的是JDK 8,你导入java.util.*。现在,假设Java 9出来了,它在包Java中有一个新类。直到它碰巧也被称为“ABC”。您的程序现在不能在Java 9上编译,因为编译器不知道您的“ABC”名称是指您自己的类还是Java .awt中的新类。

如果只从java显式地导入这些类,就不会遇到这个问题。你实际使用的。

资源:

Java进口

导入包中的所有类被认为是一种盲目的方法。这样做的一个主要原因是,它会使类名称空间变得混乱,并可能导致具有相同名称的不同包中的类之间发生冲突。

具体地填充必要的类可以避免这个问题,并清楚地显示需要哪些版本。这有利于代码的可维护性。

性能:由于字节码相同,对性能没有影响。 尽管这会导致一些编译开销。

编译:在我的个人机器上,编译一个空白类而不导入任何东西需要100毫秒,但导入java时是同一个类。*占用170毫秒。

请参阅我的文章“按需进口是邪恶的”

简而言之,最大的问题是当一个类被添加到您导入的包中时,您的代码可能会中断。例如:

import java.awt.*;
import java.util.*;

// ...

List list;

在Java 1.1中,这很好;在java中找到列表。啊,没有冲突。

现在假设您检入了运行良好的代码,一年后,其他人使用Java 1.2编辑了它。

Java 1.2在Java .util中添加了一个名为List的接口。繁荣!冲突。完美工作的代码不再工作。

这是一个邪恶的语言特性。没有理由仅仅因为一个类型被添加到包中就停止编译……

此外,它使读者难以确定您使用的是哪个“Foo”。

唯一的问题是它会混淆本地名称空间。例如,假设您正在编写一个Swing应用程序,因此需要java.awt。事件,并且还与公司的日历系统进行接口,该系统具有com.mycompany.calendar.Event。如果你使用通配符方法导入两者,会发生以下三种情况之一:

event和com.mycompany.calendar之间存在完全的命名冲突。事件,因此您甚至无法编译。 您实际上只导入了一个(两个导入中只有一个导入了。*),但它是错误的,并且您很难弄清楚为什么代码声称类型是错误的。 在编译代码时,没有com.mycompany.calendar。事件,但当他们后来添加一个时,您以前有效的代码突然停止编译。

显式列出所有导入的好处是,我可以一眼看出您打算使用哪个类,这使得代码的阅读更加容易。如果您只是在做一个快速的一次性的事情,那么没有什么明显的错误,但是未来的维护者会因为您的清晰而感谢您。