导入包。* vs import package.SpecificType

时间:2008-10-09 14:12:45

标签: java import overhead

它是否会假设编写导入的开销加载一个包中的所有类型(import java.*);而不只是一个特定的类型(即import java.lang.ClassLoader)?第二个是比另一个更合适的使用方式吗?

10 个答案:

答案 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 issueDoes 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)

这是一个很好的编码实践,因为任何阅读代码的人都会立即知道特定类使用哪些类,只需查看文件顶部的导入块,而人们必须挖掘以查明是否使用通配符。