陷阱 - 通配符导入会使你的代码变得脆弱

考虑以下部分示例:

import com.example.somelib.*;
import com.acme.otherlib.*;

public class Test {
    private Context x = new Context();   // from com.example.somelib
    ...
}

假设当你第一次开发针对 somelib 版本 1.0 和 otherlib 版本 1.0 的代码时。然后在稍后的某个时刻,你需要将依赖项升级到更高版本,然后决定使用 otherlib 2.0 版。还假设他们对 otherlib 在 1.0 和 2.0 之间做出的改变之一是添加一个 Context 类。

现在当你重新编译 Test 时,你会得到一个编译错误,告诉你 Context 是一个含糊不清的导入。

如果你熟悉代码库,这可能只是一个小小的不便。如果没有,那么你有一些工作要做,以解决这个问题,在这里,也可能在其他地方。

这里的问题是通配符导入。一方面,使用通配符可以使你的类缩短几行。另一方面:

  • 向代码库的其他部分,Java 标准库或第三方库向上兼容的更改可能导致编译错误。

  • 可读性受到影响。除非你使用的是 IDE,否则确定哪个通配符导入会在命名类中进行操作可能会很困难。

经验教训是,在需要长寿的代码中使用通配符导入是一个坏主意。如果使用 IDE,特定(非通配符)导入的维护工作量不大,值得付出努力。