使用单个语句更方便,更简洁,比如
import java.awt.*;
而不是导入一堆单独的类
import java.awt.Panel;
import java.awt.Graphics;
import java.awt.Canvas;
...
在import语句中使用通配符有什么问题?
使用单个语句更方便,更简洁,比如
import java.awt.*;
而不是导入一堆单独的类
import java.awt.Panel;
import java.awt.Graphics;
import java.awt.Canvas;
...
在import语句中使用通配符有什么问题?
当前回答
请参阅我的文章“按需进口是邪恶的”
简而言之,最大的问题是当一个类被添加到您导入的包中时,您的代码可能会中断。例如:
import java.awt.*;
import java.util.*;
// ...
List list;
在Java 1.1中,这很好;在java中找到列表。啊,没有冲突。
现在假设您检入了运行良好的代码,一年后,其他人使用Java 1.2编辑了它。
Java 1.2在Java .util中添加了一个名为List的接口。繁荣!冲突。完美工作的代码不再工作。
这是一个邪恶的语言特性。没有理由仅仅因为一个类型被添加到包中就停止编译……
此外,它使读者难以确定您使用的是哪个“Foo”。
其他回答
性能:由于字节码相同,对性能没有影响。 尽管这会导致一些编译开销。
编译:在我的个人机器上,编译一个空白类而不导入任何东西需要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”。
It helps to identify classname conflicts: two classes in different packages that have the same name. This can be masked with the * import. It makes dependencies explicit, so that anyone who has to read your code later knows what you meant to import and what you didn't mean to import. It can make some compilation faster because the compiler doesn't have to search the whole package to identify depdencies, though this is usually not a huge deal with modern compilers. The inconvenient aspects of explicit imports are minimized with modern IDEs. Most IDEs allow you to collapse the import section so it's not in the way, automatically populate imports when needed, and automatically identify unused imports to help clean them up.
我工作过的大多数使用大量Java的地方都将显式导入作为编码标准的一部分。我有时仍然使用*来快速创建原型,然后在产品化代码时展开导入列表(一些ide也会为您这样做)。
忘掉混乱的命名空间……想想那些不得不在GitHub、vi、notepad++或其他非ide文本编辑器中阅读和理解你的代码的可怜人吧。
这个人必须煞费苦心地查找每个通配符作用域中所有类和引用中来自一个通配符的每个标记……只是想搞清楚到底发生了什么。
如果你只是为编译器编写代码——而且你知道你在做什么——我相信通配符没有问题。
但是,如果其他人(包括未来的您)希望一次阅读就能快速理解某个特定的代码文件,那么显式引用会有很大帮助。
导入包中的所有类被认为是一种盲目的方法。这样做的一个主要原因是,它会使类名称空间变得混乱,并可能导致具有相同名称的不同包中的类之间发生冲突。
具体地填充必要的类可以避免这个问题,并清楚地显示需要哪些版本。这有利于代码的可维护性。