有没有充分的理由避免在Java中使用未使用的import语句?据我所知,它们适用于编译器,因此许多未使用的导入不会对编译的代码产生任何影响。它只是为了减少混乱并避免命名冲突吗?
(我问,因为Eclipse发出了关于未使用的导入的警告,这在我开发代码时有点烦人,因为我不想删除导入,直到我很确定我已经完成了设计类。 )
答案 0 :(得分:80)
如果您不删除导入,我认为不会出现性能问题或类似问题。
但可能存在命名冲突,在极少数情况下会导致列表界面。
在Eclipse中,您始终可以使用快捷方式(取决于操作系统 - Win:Ctrl + SHIFT + O
和Mac:COMMAND + SHIFT + O
)来组织导入。 Eclipse然后清理导入部分删除所有陈旧的导入等。如果您需要再次导入的东西,eclipse将在您使用Ctrl + SPACE
完成语句时自动添加它们。所以没有必要在你的课堂上保留未使用的代码。
因为在阅读代码并在活动代码中留下一些东西时,未使用的代码会分散您和其他人的注意力,因为我以后可能需要它,这通常被认为是不好的做法。
答案 1 :(得分:50)
如果你从类路径中删除导入引用的类,那么你就不会得到一个没有用处的愚蠢的编译器错误。当你执行“在哪里使用”搜索时,你不会得到误报。
另一个(但这本质上是非常具体的)将是未使用的导入与另一个导入的命名冲突,导致您不必要地使用完全限定名称。
附录:今天构建服务器启动失败编译(甚至没有测试运行),出现内存不足错误。它运行良好,签入没有任何更改构建过程或可以解释这一点的重要补充。在尝试增加内存设置(这是在64位CentOS上运行64位JVM!)到远远超出客户端编译的位置之后,我逐个检查了签入。
开发人员使用和放弃了一个不正确的导入(他们使用该类,自动导入它,然后意识到这是一个错误)。未使用的导入在应用程序的整个单独层中拉出,虽然IDE未配置为将它们分开,但构建过程是。单个导入拖入了很多类,编译器试图编译而没有类路径中的相关依赖库,这导致了很多问题导致了内存不足错误。解决由未使用的导入引起的问题花了一个小时。
答案 2 :(得分:9)
从纯粹主义的角度来看,任何依赖都是对产品的“约束”,因此可能导致以后的维护问题。
例如,假设您的程序使用类com.X.Y.Z.ObjectPool,稍后您决定不使用它但从不删除导入。 如果其他人现在想要实例化org.W.V.Y.ObjectPool并且只是引用ObjectPool,他们就不会得到任何关于它的警告,直到某个地方有一个转换问题或调用问题。
顺便说一句,这不是一个不切实际的场景。每当你有Eclipse问你要导入哪个特定版本的X,并从多个软件包中选择一个时,如果你已经进行了导入,你可能会在不知情的情况下做出错误的选择。< / p>
无论哪种方式,您都可以要求Eclipse为您清理这些
答案 3 :(得分:3)
警告?让Eclipse自动为您清理它们。这就是IntelliJ所做的。如果它足够聪明地警告你,它应该足够聪明来清理它们。我建议寻找一个Eclipse设置来告诉它不要再做这样的事了。
答案 4 :(得分:3)
这与清洁有助于维护的程序有关。
如果你必须维护一个程序,你会发现每行有一个类导入是多么有用。
考虑以下情况:
import company.billing.*;
import company.humanrerources.*;
// other imports
class SomeClass {
// hundreds or thousands of lines here...
public void veryImportantMethod() {
Customer customer;
Employee comployee;
Department dept.
// do something with them
}
}
当您修改或维护一段代码(或只是阅读它)时,读者知道所使用的类属于哪个包是非常有帮助的。如上所示使用通配符导入无助于此目的。
即使使用IDE,您也不希望悬停或跳转到声明和返回,如果您在功能方面了解当前代码所依赖的其他包和类,则会更容易。
如果这是针对个人项目或小事,那真的没关系,但对于其他开发者必须使用的更大的东西(并且多年来一直保持),这是必须的。
与任何人完全没有性能差异。
答案 5 :(得分:3)
仅供参考,这让我感到震惊,因为我认为组织进口实际上没有删除未使用的进口产品,我认为它只是对它们进行了分类。
在保存操作期间自动删除导入会让我感到悲痛,例如,在开发或测试过程中遇到问题并注释掉一些代码时,当您保存代码时,注释掉的代码部分使用的导入将被删除。有时这不是问题,因为你可以撤消( Ctrl + Z )这些更改,但有时候它不是那么简单,因为你可能已经做了其他更改。我也遇到了一个问题,当我取消注释代码时(我之前已注释掉然后保存,从而删除了该代码的导入),它会自动尝试猜测所需的导入并选择错误的导入(例如我想我有一个StringUtils
类被使用,它从错误的库中选择了另一个具有相同名称的类。)
我更喜欢手动组织导入,而不是将其作为保存操作。
答案 6 :(得分:2)
对于eclipse我使用:window - &gt;偏好 - &gt; java - &gt;编辑 - &gt;保存操作 - &gt;选中用于组织导入的复选框(还有很多其他有用的东西,比如格式化,使字段最终等等)。因此,当我保存我的文件时,eclipse会为我删除unessacry导入。在我看来,如果你不需要什么,那么删除它(或让它被eclipse删除)。
答案 7 :(得分:2)
您可以注释掉未使用的导入语句,警告不会打扰您,但您可以看到您拥有的内容。
答案 8 :(得分:1)
没有任何性能影响,但为了便于阅读,您可以使其干净。在Eclipse和IntelliJ IDEA中删除未使用的导入非常简单。
<强>的Eclipse 强>
Windows / Linux - Ctrl + Shift + O
Mac - Cmd + Shift + O
IntelliJ IDEA 或 Android Studio
Windows / Linux - Ctrl + Alt + O
Mac - Cmd + Alt + O
答案 9 :(得分:1)
未使用的导入仍会创建依赖项。如果您没有意识到依赖只是因为未使用的导入,您可以浪费时间更新模块版本、调查与该模块相关的漏洞报告等。
在极端情况下,仅在应用程序的类路径上提供模块(即使您的代码不使用它)也会产生可利用的漏洞。例如,原本未使用的库中的反序列化小工具可能存在远程代码执行漏洞。
使您的代码更具可读性应该足以清理这些,但具有不必要的依赖项也存在真正的功能缺陷。
答案 10 :(得分:0)
几年前,我在某处读过,每个导入的类都会在运行时使用导入类加载。因此,删除未使用的,特别是整个包,将减少内存开销。 虽然我认为java的现代版本处理了这个问题,但可能它不再是一个原因了。
顺便说一句,使用eclipse,您可以使用 Ctrl + Shift + O 来组织导入,但您也可以配置“每次保存java文件时都会处理这些事情(以及许多其他事情)。
答案 11 :(得分:0)
对我来说,在代码清理期间删除导入的类并在git中提交删除而不在本地测试构建之后,控制器类中的一个未使用的类导入在Jenkins构建中创建了编译问题。