它是否会假设编写导入的开销加载一个包中的所有类型(import java.*
);而不只是一个特定的类型(即import java.lang.ClassLoader
)?第二个是比另一个更合适的使用方式吗?
答案 0 :(得分:107)
看看java API,你会在不同的包中看到许多具有相同名称的类和接口。
例如:
java.lang.reflect.Array
java.sql.Array
因此,如果您导入java.lang.reflect.*
和java.sql.*
,您将在阵列类型上发生冲突,并且必须在代码中完全限定它们。
导入特定的课程将为您节省麻烦。
答案 1 :(得分:89)
执行导入没有性能或间接成本。* vs导入特定类型。但是,我认为从不使用导入是最好的做法。*我的主要原因是我只想保持事情的直接,干净和尽可能少的模棱两可,我想用。* import你输了
答案 2 :(得分:29)
这实际上是一个非常糟糕的问题。
假设你写了
import a.*;
import b.*;
...
Foo f;
和类Foo存在于包a。
中现在您检查完美的编译代码,六个月后,有人将类Foo添加到包b中。 (也许它是第三方库,在最新版本中添加了类)。
噗!现在你的代码拒绝编译。
从不 使用按需导入。这是邪恶的!
有关详细信息,请参阅http://javadude.com/articles/importondemandisevil.html。
RE表现:
import a.*;
VS
import a.X;
在运行时没有任何区别。编译器将已解析的类名称硬编码到生成的.class文件中。
答案 3 :(得分:13)
少数人观点:在我的代码中我倾向于使用几个包中的大量类以及一些奇怪的类。我喜欢保持我的进口清单很小,所以我可以一眼就看出发生了什么。为此,我将阈值设置为4个类。在此之上,Eclipse将使用*作为我的代码。我发现这可以保持我的包导入的可读性,当我查看一个类时,我倾向于将它们称为我做的第一件事,回答这个问题:谁与它交谈?
关于名称冲突:从两个具有竞争类名的包中导入四个或更多类的可能性有多大?如果它超过10%的时间,您可能需要考虑您的类所依赖的包数(例如,将其重构为较小的类)。
答案 4 :(得分:8)
永远不要使用import xxx。*的一个很好的理由是要有dependencies的清晰视野。
您可以更快地了解您正在使用另一个包的特定类,因为它列在源文件的开头。
答案 5 :(得分:8)
在寻找更多信息之后,我偶然发现了这个网站。 Import issue和Does using * in an import statement affect performance?。
这两种风格之间是否存在效率问题?可能,但由于导入声明实际上并没有将任何内容导入到您的程序中,因此任何差异都非常小。请记住,在编译单元的顶部有一个隐式的导入java.lang。*,而JDK 1.2.2中的java.lang包含75个类和接口。使用一个设计实例的实验,其中包含必须查找的数千个类名使用,显示编译速度的变化可以忽略不计。因此,在选择一种格式而不是另一种格式时,编译性能可能不应被视为一个因素。
对进口申报有一个最终的兴趣角度。假设您使用内部类:
package P;
public class A {
public static class B {}
}
如果要从其他编译单元访问A,请说:
import P.*;
或: 进口P.A; 但是如果你想在没有资格的情况下访问B,你需要说:
import P.A.*;
或: 进口P.A.B; 其中第一个在包P中找到A类中的可用类型。第二个在P包中的A类中找到类型B.
答案 6 :(得分:4)
如果要从同一个软件包导入20个以上的类,最好使用import xxx。*。 “清洁代码”也支持导入整个包。
答案 7 :(得分:3)
我倾向于使用IDE默认的任何内容。我发现它并不值得担心,因为它没有性能影响,并且可以使用各种工具处理检查依赖项。
答案 8 :(得分:2)
导入在字节码级别无关紧要,因此不应存在运行时差异。
我觉得最好: a)通过列出所有进口来明确 b)让你的IDE管理它。任何主要的IDE都可以自动更新,排序和完成导入。
我发现a)在IDE重构的上下文之外进行手动重新打包时会派上用场几次。例如,当营销更改产品名称并决定所有包装应更改名称时。
答案 9 :(得分:1)
这是一个很好的编码实践,因为任何阅读代码的人都会立即知道特定类使用哪些类,只需查看文件顶部的导入块,而人们必须挖掘以查明是否使用通配符。