109

是否会假设在编写一个导入加载一个包中的所有类型的开销方面有任何差异(import java.*)?不仅仅是一个特定的类型(即import java.lang.ClassLoader)?第二种会比另一种更可取吗?

4

10 回答 10

132

看一下java API,你会在不同的包中看到许多同名的类和接口。

例如:

java.lang.reflect.Array
java.sql.Array

因此,如果您导入java.lang.reflect.*并且java.sql.*您将在 Array 类型上发生冲突,并且必须在您的代码中完全限定它们。

相反,导入特定的类将为您省去这个麻烦。

于 2008-10-09T14:21:21.457 回答
115

进行 import .* 与导入特定类型相比,没有性能或开销成本。但是,我认为永远不要使用 import .* 是一个最佳实践.

于 2008-10-09T14:17:00.530 回答
32

这实际上是一个非常糟糕的问题。

假设你写

import a.*;
import b.*;
...
Foo f;

并且类 Foo 存在于包 a 中。

现在你检查你完美编译的代码,六个月后,有人将类 Foo 添加到包 b 中。(也许是在最新版本中添加了类的第三方库)。

噗!现在您的代码拒绝编译。

永远不要使用按需导入。是邪恶的!

有关详细信息,请参阅http://javadude.com/articles/importondemandisevil.html 。

稀土性能:

import a.*;

对比

import a.X;

在运行时没有区别。编译器将解析的类名硬连线到生成的 .class 文件中。

于 2008-10-09T18:46:25.743 回答
15

少数派观点:在我的代码中,我倾向于使用来自几个包的大量类以及一些奇怪的类。我喜欢保持我的进口清单很小,这样我就可以一眼看出发生了什么。为此,我将阈值设置为 4 个班级。除此之外,Eclipse 将使用 * 作为我的代码。我发现这使我的包导入可读,并且我倾向于将它们称为我查看课程时要做的第一件事,以回答以下问题:它与谁交谈?

关于名称冲突:您从两个具有竞争类名的包中导入四个或更多类的可能性有多大?如果超过 10% 的时间,您可能需要考虑您的类所依赖的包的数量(例如,将其重构为更小的类)。

于 2010-01-26T21:19:52.323 回答
11

从不使用 import xxx.* 的一个很好的理由是对依赖有清晰的认识。

您可以更快地知道您正在使用另一个包的特定类,因为它列在源文件的开头。

于 2008-10-09T14:19:45.140 回答
11

在寻找更多信息后,我发现了这个网站,其中解释得很好。导入问题在导入语句中使用 * 会影响性能吗?.

这两种风格之间是否存在效率问题?可能,但由于导入声明实际上并没有将任何内容导入您的程序,因此任何差异都非常小。请记住,在编译单元的顶部有一个隐式导入 java.lang.*,而 JDK 1.2.2 中的 java.lang 包含 75 个类和接口。使用一个人为示例的实验,一个必须查找数千个类名使用的示例,显示编译速度的变化可以忽略不计。因此,在选择一种格式而不是另一种格式时,编译性能可能不应该被视为一个因素。

最后一个关于进口申报的兴趣点。假设您使用内部类:

package P;

public class A {
    public static class B {}
}

如果你想从另一个编译单元访问 A,你说:

import P.*;

或:进口PA;但是如果你想在没有资格的情况下访问 B,你需要说:

import P.A.*;

或:进口PAB;其中第一个使包 P 中的类 A 中的类型可用。第二个使包 P 中的类 A 中的类型 B 可用。

于 2008-10-09T15:23:24.013 回答
5

我倾向于使用 IDE 默认值。我发现这并不是真正值得担心的事情,因为它对性能没有影响,并且可以使用各种工具来检查依赖关系。

于 2008-10-09T15:53:49.630 回答
5

如果你从同一个包中导入超过 20 个类,你最好使用 import xxx.*。“清洁代码”也有利于导入整个包。

于 2011-12-10T08:29:02.773 回答
2

导入在字节码级别无关紧要,因此应该没有运行时差异。

我发现最好:a)通过列出所有导入来明确b)让您的IDE管理它。任何主要的 IDE 都可以自动更新、排序和完成您的导入。

我发现 a) 在在 IDE 重构的上下文之外进行手动重新打包时会派上用场。例如,当营销更改您的产品名称并决定您的所有包裹都应该更改名称时。

于 2008-10-09T17:11:17.167 回答
1

这更像是一种很好的编码实践,因为任何阅读您的代码的人都会通过查看文件顶部的导入块立即知道特定类使用了哪些类,而您必须深入了解您是否使用了通配符。

于 2010-01-26T21:45:52.420 回答