是否会在编写导入时将开销加载到一个包中的所有类型(import java.*
); 而不只是一个特定的类型(即import java.lang.ClassLoader
)?第二个是比另一个更合适的使用方式吗?
看一下java API,你会在不同的包中看到许多具有相同名称的类和接口.
例如:
java.lang.reflect.Array java.sql.Array
因此,如果您导入java.lang.reflect.*
并且java.sql.*
您将在Array类型上发生冲突,并且必须在代码中完全限定它们.
相反,导入特定的类将为您节省麻烦.
导入时没有性能或间接成本.*vs导入特定类型.但是,我认为从不使用导入是最好的做法.*我的主要原因是我只想保持事情的直接,干净和尽可能少的模棱两可,我想用.*import你会失去那个.
这实际上是一个非常糟糕的问题.
假设你写
import a.*; import b.*; ... Foo f;
和类Foo存在于包a中.
现在,您检查完美的编译代码,六个月后,有人将类Foo添加到包b中.(也许它是第三方库,在最新版本中添加了类).
噗!现在你的代码拒绝编译.
永远不要使用按需进口.这是邪恶的!
有关详细信息,请参阅http://javadude.com/articles/importondemandisevil.html.
RE表现:
import a.*;
VS
import a.X;
在运行时没有任何区别.编译器将已解析的类名称硬编码到生成的.class文件中.
少数派观点:在我的代码中,我倾向于使用几个包中的大量类以及一些奇怪的类.我喜欢保持我的进口清单很小,所以我可以一眼就看出发生了什么.为此,我将阈值设置为4个类.在此之上,Eclipse将使用*作为我的代码.我发现这可以保持我的包导入可读,我倾向于将它们称为我在看课时的第一件事,回答这个问题:谁与它交谈?
关于名称冲突:从两个具有竞争类名的包中导入四个或更多类的几率是多少?如果它超过10%的时间,您可能需要考虑您的类所依赖的包的数量(例如,将其重构为较小的类).
永远不要使用import xxx.*的一个很好的理由是对依赖关系有清晰的认识.
您可以更快地了解您正在使用另一个包的特定类,因为它列在源文件的开头.
在寻找更多信息之后,我偶然发现了这个网站.导入问题并在导入语句中使用*会影响性能吗?.
这两种风格之间有效率问题吗?可能,但由于导入声明实际上并没有将任何内容导入到您的程序中,因此任何差异都非常小.请记住,在编译单元的顶部有一个隐式的导入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; 第一个在类包A中找到类A中的可用类型.第二个使得包A中的类A中的类型B可用.