导入包.*vs import package.SpecificType

Jua*_*nez 93 java import overhead

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

Chr*_*ore 113

看一下java API,你会在不同的包中看到许多具有相同名称的类和接口.

例如:

java.lang.reflect.Array
java.sql.Array
Run Code Online (Sandbox Code Playgroud)

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

相反,导入特定的类将为您节省麻烦.

  • 命名冲突!我确实忽略了那一个.+1给你 (6认同)

shs*_*mer 93

导入时没有性能或间接成本.*vs导入特定类型.但是,我认为从不使用导入是最好的做法.*我的主要原因是我只想保持事情的直接,干净和尽可能少的模棱两可,我想用.*import你会失去那个.

  • 怀疑这将有任何优化问题.除了命名冲突,您可以使用特定的import语句轻松避免它们.即使你懒得输入所有的导入,现代IDE也会为你做... (2认同)

Sco*_*eld 29

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

假设你写

import a.*;
import b.*;
...
Foo f;
Run Code Online (Sandbox Code Playgroud)

和类Foo存在于包a中.

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

噗!现在你的代码拒绝编译.

永远不要使用按需进口.这是邪恶的!

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

RE表现:

import a.*;
Run Code Online (Sandbox Code Playgroud)

VS

import a.X;
Run Code Online (Sandbox Code Playgroud)

在运行时没有任何区别.编译器将已解析的类名称硬编码到生成的.class文件中.

  • 这不是*"邪恶"*,它只是有一个你应该意识到的缺点. (7认同)
  • 有什么优势?使用当今自动添加和折叠/折叠导入的 IDE 和编辑器,我看到了按需导入的 _zero_ 优势。当_only_发生的事情是将新类添加到jar时,允许先前工作的代码中断的语言功能绝对是邪恶的。 (2认同)

Dan*_*ark 13

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

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

  • 我同意; 我在实践中只碰到过AWT List和util List碰撞,然后我通常只为我想要的那个添加一个特定的导入,通常是集合. (4认同)
  • @Software Monkey,是的.包的全部意义在于它们是粘在一起的类,这就是导入背后的原因. (2认同)

Von*_*onC 9

永远不要使用import xxx.*的一个很好的理由是对依赖关系有清晰的认识.

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

  • 如果您的导入列表长度为70或200行,则您不再对依赖关系有清晰的认识. (12认同)
  • 但这不是导入声明的错,它是你的. (8认同)
  • 我认为如果您使用该类的 3 个以上的类,最好使用 .* (2认同)

Jua*_*nez 9

在寻找更多信息之后,我偶然发现了这个网站.导入问题在导入语句中使用*会影响性能吗?.

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

进口申报有一个最终的利益角度.假设您使用内部类:

package P;

public class A {
    public static class B {}
}
Run Code Online (Sandbox Code Playgroud)

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

import P.*;
Run Code Online (Sandbox Code Playgroud)

或:导入PA; 但如果您想无限制地访问B,您需要说:

import P.A.*;
Run Code Online (Sandbox Code Playgroud)

或:导入PAB; 第一个在类包A中找到类A中的可用类型.第二个使得包A中的类A中的类型B可用.


Ron*_*ist 5

我倾向于使用 IDE 的默认设置。我发现这并不值得担心,因为它没有性能影响,并且可以使用各种工具处理依赖项检查。


Onu*_*nur 5

如果要从同一个包中导入 20 多个类,最好使用 import xxx.*。“清洁代码”也支持导入整个包。