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

2022-08-31 04:21:44

使用单个语句(如

import java.awt.*;

而不是导入一堆单独的类

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

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


答案 1

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

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

显式列出所有导入的优点是,我可以一目了然地分辨出您要使用哪个类,这只会使阅读代码变得更加容易。如果你只是在做一个快速的一次性事情,没有什么明显的错误,但未来的维护者会感谢你的清晰度。


答案 2

这是对明星进口投票。import 语句用于导入,而不是类。导入整个包装要干净得多;此处确定的问题(例如 vs)很容易通过其他手段补救,而不是通过特定的进口来真正解决,当然也不能证明所有类别的疯狂迂腐进口是合理的。没有什么比打开源文件并必须翻阅 100 个 import 语句更令人不安的了。java.sql.Datejava.util.Date

做特定的导入会使重构更加困难;如果删除/重命名类,则需要删除其所有特定导入。如果将实现切换到同一包中的其他类,则必须修复导入。虽然这些额外的步骤可以自动化,但它们实际上是生产力的打击,没有真正的收益。

如果 Eclipse 在默认情况下不执行特定的类导入,那么每个人都会执行星形导入。很抱歉,做特定的进口真的没有合理的理由。

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

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