Java中冗余导入语句的影响是什么?
什么是冗余的java import
语句?
它们会影响编译的运行时(性能/大小)吗? 还是像intellisense这样的东西?
提出不同的问题:删除它们有多重要?
Import语句仅影响编译期间发生的事情。
编译器接受此代码,并创建一个.class
文件,该文件以可执行格式表示您的代码(二进制代码)。
最后,二进制文件完全相同,但它们的制作方法是不同的。
让我们看一个简单的案例:
import java.util.*;
VS
import java.util.ArrayList; import java.util.List;
用于:
//... List someList = new ArrayList (); //...
当编译器命中单词List
,在第一种情况下,它需要弄清楚List
存在于那组类中。 在第二种情况下,已经明确地给出了它,因此它更容易。
本质上,发生的事情是编译器必须获取import
语句中存在的所有类并跟踪它们的名称,以便在使用它时,编译器可以检索您正在调用的相应函数。
有时,在多个包中存在具有相同名称的类。 在这种情况下(Thomas指的是),您不应该使用*
来选择目录中的所有类。
最佳做法是明确描述您的类使用情况。
具有多余的import语句不会影响性能。 它可能使源代码比它应该更长,但对编译的代码没有影响。 Java本身导入不必要的类文件 – 请参阅Java语言规范 部分7.5.5 :
每个编译单元自动导入在预定义包java.lang中声明的所有公共类型名称,就像声明一样:
import java.lang.*;
出现在每个编译单元的开头,紧跟任何包声明之后。
第7.5.2节说
类型导入按需声明永远不会导致任何其他声明被遮蔽。
…意味着通配符导入不会胜过单输入。
正如其他人所指出的,任何体面的IDE(NetBeans,Eclipse等)都会为您删除未使用的导入。
像许多关于性能的问题一样,代码的清晰度通常更为重要。 这应该是您的第一个想法,并且只有在您遇到已知(测量)性能问题的极少数情况下,您应该考虑不要编写最简单,最清晰的代码。
像许多性能问题一样,在这种情况下,最简单,最清晰的代码也是最快的。
您应该保持import
或让IDE维护它们,以使它们保持清晰并使代码更易于维护。 即使对于编译器或IDE,性能问题也非常小。
命名空间冲突最大的危险。 例如,如果两个导入的库都具有List类型,则它可能不会使用您认为的类型。
删除它们很重要,因为它们会给.java
文件添加膨胀,因为在给定文件中删除它们既快又便宜,特别是如果你使用IDE( CTRL – SHIFT – O ,我相信,是Eclipse中的快捷方式)。
至于“多余的import为机器做什么”,嗯,真的不多。 类本身只会被添加到相关的jar
文件中一次,并且每个类只会加载一次(请参阅“不是每个类”),所以除了添加一些微不足道的时间进行编译之外,它不会对程序本身产生任何实质性的长期影响。
也就是说,解决这个问题既便宜又容易:如果你没有使用IDE,那么你应该有一个明确的分组导入语句,这些语句在一些合理的顺序中开始(我按字母顺序排列,意思是我会立即看到两个java.util.Map
导入,因为它们彼此相邻!)。 如果你没有解决问题,那么你的编码员会积极参与,所以我建议这样做符合你的最佳利益。