可能重复:
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项目,所以我仍然在学习更多的企业方面。
答案 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.util
和java.util.logging
是包,而java.util.Calendar
,java.util.logging.Level
等是类。
类型(类/接口)是您可以在程序中使用的东西,而包主要只是一个名称空间,用于放置类和接口。 (此外,它会对可见性产生一些影响。)
您可以直接在包中导入单个类型(通过指定其名称)或所有类型(通过指定包和.*
)。 (您也可以使用通配符导入类型中的所有嵌套类型,或者使用import static <class>.*
导入类的所有静态方法/字段,只是为了完整性。)
导入永远不会递归,通配符导入仅适用于一个级别。 (并且您也无法使用import java.util.*.*
导入日志记录类。)
答案 2 :(得分:2)
导入通配符包可能会稍微降低编译速度,但不会影响正在运行的代码的后续性能。
但是,首选导入所需的类是首选。
答案 3 :(得分:1)
我总是喜欢将所有内容分开导入。在我的项目中,它也是一个代码约定,并且禁止在import语句中使用通配符。
查看此question的答案,原因很充分。
答案 4 :(得分:1)
这有什么性能/效率成本?
无。导入+短类名称到完全限定名称将在编译时解析。
是否重要?
排序。当您导入整个软件包时,您会对未来的编译错误保持开放,因为您导入的某些软件包在将来的版本中会增长,导致导入模糊。
此外,这只是一个黑暗的镜头,但有没有办法导入整个项目的包?
没有。如果你一遍又一遍地导入java.util, java.text
以外的包,我会称之为反模式的臭味。也许您的代码库中缺少抽象。 Facades,基类,都减少了对外部包的直接耦合和依赖。