为什么在 Java 导入语句中使用通配符不好?

新手上路,请多包涵

使用像这样的单个语句更方便、更简洁

import java.awt.*;

而不是导入一堆单独的类

import java.awt.Panel;
import java.awt.Graphics;
import java.awt.Canvas;
...

import 语句中使用通配符有什么问题?

原文由 jnancheta 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 858
2 个回答

唯一的问题是它使您的本地命名空间变得混乱。例如,假设您正在编写一个 Swing 应用程序,因此需要 java.awt.Event ,并且还与公司的日历系统交互,该系统具有 com.mycompany.calendar.Event 。如果您使用通配符方法导入两者,则会发生以下三种情况之一:

  1. 您在 java.awt.Eventcom.mycompany.calendar.Event 之间存在彻底的命名冲突,因此您甚至无法编译。
  2. 你实际上只导入了一个(你的两个导入中只有一个是 .* ),但它是错误的,你很难弄清楚为什么你的代码声称类型是错误的。
  3. 当您编译代码时,没有 com.mycompany.calendar.Event ,但是当他们后来添加一个时,您以前有效的代码突然停止编译。

显式列出所有导入的好处是我可以一眼看出您打算使用哪个类,这使得阅读代码变得更加容易。如果你只是做一件快速的一次性事情,没有什么明显的 _错误_,但未来的维护者会感谢你的清晰说明。

原文由 Benjamin Pollack 发布,翻译遵循 CC BY-SA 3.0 许可协议

这里 明星进口投票。 import 语句旨在导入 _包_,而不是类。导入整个包要干净得多;此处确定的问题(例如 java.sql.Date vs java.util.Date )很容易通过其他方式解决,并没有通过特定的进口 真正 解决,当然也不能证明对所有类别的疯狂学究进口是合理的。没有什么比打开源文件不得不翻阅 100 条导入语句更令人不安的了。

进行特定的导入会使重构更加困难;如果你删除/重命名一个类,你需要删除它的 所有 特定导入。如果将实现切换到同一包中的不同类,则必须修复导入。虽然这些额外的步骤可以自动化,但它们确实会影响生产力,并没有真正的收益。

如果默认情况下 Eclipse 不执行特定的类导入,那么每个人仍然会执行 star 导入。抱歉,进行特定进口确实没有合理的理由。

以下是处理类冲突的方法:

 import java.sql.*;
import java.util.*;
import java.sql.Date;

原文由 davetron5000 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题