在java中导入特定包或带有通配符的整个树是否更好?

时间:2011-06-08 14:24:04

标签: java import performance package

  

可能重复:
  Why is using a wild card with a Java import statement bad?

现在我使用了很多java.util包:

import java.util.Calendar;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

这样做会更有效率:

import java.util.*;

这有什么性能/效率成本?它甚至重要吗?请原谅我对这个问题的无知。

此外,这只是在黑暗中拍摄,但有没有办法导入整个项目的包?所以我不需要每班重新导入它们?这是我的第一个大型Java项目,所以我仍然在学习更多的企业方面。

5 个答案:

答案 0 :(得分:7)

导入细节是一种很好的做法。 Eclipse在没有任何工作的情况下为您完成此操作 - 只需使用“组织导入”(按ctrl + shift + o windows或cmd + shift + o mac)。

原因是你加载哪些课程从来没有混淆。

答案 1 :(得分:4)

此外,您不能包含整棵树。您可以将导入列表缩减为

import java.util.Calendar;
import java.util.logging.*;

import java.util.*;

不导入java.util.logging包中的任何内容。对于Java编译器,没有子包。也不适用于VM(除了一些使用包结构作为文件目录结构的类加载器)。


此外,您似乎正在混合概念 package class / interface (或 type )。 java.utiljava.util.logging是包,而java.util.Calendarjava.util.logging.Level等是类。

类型(类/接口)是您可以在程序中使用的东西,而包主要只是一个名称空间,用于放置类和接口。 (此外,它会对可见性产生一些影响。)

您可以直接在包中导入单个类型(通过指定其名称)或所有类型(通过指定包和.*)。 (您也可以使用通配符导入类型中的所有嵌套类型,或者使用import static <class>.*导入类的所有静态方法/字段,只是为了完整性。)

导入永远不会递归,通配符导入仅适用于一个级别。 (并且您也无法使用import java.util.*.*导入日志记录类。)

答案 2 :(得分:2)

导入通配符包可能会稍微降低编译速度,但不会影响正在运行的代码的后续性能。

但是,首选导入所需的类是首选。

答案 3 :(得分:1)

我总是喜欢将所有内容分开导入。在我的项目中,它也是一个代码约定,并且禁止在import语句中使用通配符。

查看此question的答案,原因很充分。

答案 4 :(得分:1)

这有什么性能/效率成本?

无。导入+短类名称到完全限定名称将在编译时解析。

是否重要?

排序。当您导入整个软件包时,您会对未来的编译错误保持开放,因为您导入的某些软件包在将来的版本中会增长,导致导入模糊。

此外,这只是一个黑暗的镜头,但有没有办法导入整个项目的包?

没有。如果你一遍又一遍地导入java.util, java.text以外的包,我会称之为反模式的臭味。也许您的代码库中缺少抽象。 Facades,基类,都减少了对外部包的直接耦合和依赖。