Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Java导入语句中使用通配符是错误的?_Java_Import_Wildcard - Fatal编程技术网

为什么在Java导入语句中使用通配符是错误的?

为什么在Java导入语句中使用通配符是错误的?,java,import,wildcard,Java,Import,Wildcard,使用这样的语句更方便、更简洁 import java.awt.*; 而不是导入一堆单独的类 import java.awt.Panel; import java.awt.Graphics; import java.awt.Canvas; ... 在import语句中使用通配符有什么问题?唯一的问题是它会弄乱本地名称空间。例如,假设您正在编写一个Swing应用程序,因此需要java.awt.Event,并且还与公司的日历系统接口,该系统具有com.mycompany.calendar.Even

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

import java.awt.*;
而不是导入一堆单独的类

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

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

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

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

  • 显式列出所有导入的优点是,我可以一目了然地告诉您要使用哪个类,这使得阅读代码变得更加容易。如果你只是做一件简单的一次性工作,没有什么明显的错误,但是未来的维护人员会感谢你的澄清。

    我更喜欢特定的导入,因为它允许我在不查看整个文件的情况下查看文件中使用的所有外部引用。(是的,我知道它不一定会显示完全限定的引用。但我尽可能避免它们。)

    它会弄乱您的命名空间,要求您完全指定任何不明确的类名。最常见的情况是:

    import java.util.*;
    import java.awt.*;
    
    ...
    List blah; // Ambiguous, needs to be qualified.
    
    它还有助于使依赖项具体化,因为您的所有依赖项都列在文件的顶部

  • 它有助于识别类名冲突:不同包中具有相同名称的两个类。这可以用*导入来屏蔽
  • 它使依赖项显式化,以便以后必须阅读您的代码的任何人都知道您想导入什么和不想导入什么
  • 它可以加快一些编译速度,因为编译器不必搜索整个包来识别dedencies,尽管这对于现代编译器来说通常不是什么大问题
  • 使用现代IDE,显式导入的不便之处被最小化。大多数IDE允许您折叠导入部分,使其不受阻碍,在需要时自动填充导入,并自动识别未使用的导入以帮助清理它们

  • 我工作过的大多数地方都使用大量Java,将显式导入作为编码标准的一部分。有时我仍然使用*进行快速原型设计,然后在生成代码时扩展导入列表(一些IDE也会为您这样做)。

    下面是对星导入的投票。import语句用于导入包,而不是类。进口整个包装要干净得多;此处确定的问题(例如,
    java.sql.Date
    vs
    java.util.Date
    )可以通过其他方式轻松解决,而不是通过特定的导入来解决,当然也不能证明在所有类上进行疯狂的迂腐导入是合理的。没有什么比打开一个源文件并翻阅100条导入语句更令人不安的了

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

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

    下面是如何处理类冲突:

    import java.sql.*;
    import java.util.*;
    import java.sql.Date;
    
    请看我的文章

    简言之,最大的问题是,将类添加到导入的包中时,代码可能会中断。例如:

    import java.awt.*;
    import java.util.*;
    
    // ...
    
    List list;
    
    在Java1.1中,这很好;列表在java.awt中找到,没有冲突

    现在,假设您签入了工作正常的代码,一年后其他人将其带出来编辑,并且正在使用Java1.2

    Java1.2在Java.util中添加了一个名为List的接口。繁荣冲突完美工作的代码不再工作

    这是一种邪恶的语言特征。没有理由仅仅因为向包中添加了类型就停止编译代码


    此外,它使读者很难确定您使用的是哪个“Foo”。

    在以前的项目中,我发现从*-导入更改为特定导入将编译时间减少了一半(从大约10分钟减少到大约5分钟)。*-导入使编译器在列出的每个包中搜索与您使用的类匹配的类。虽然这段时间可能很短,但对于大型项目来说,这段时间会很长

    *-导入的一个副作用是,开发人员会复制和粘贴常见的导入行,而不是考虑他们需要什么。

    将通配符与Java导入语句结合使用也不错

    在本文中,Robert C.Martin实际上建议使用它们来避免冗长的导入列表

    建议如下:

    J1:通过使用 通配符

    如果您使用一个数据库中的两个或多个类 包,然后导入整个包 与

    进口包装。*

    长长的进口清单让人望而生畏 读者。我们不想弄得乱七八糟 在模块顶部添加80个 进口产品线。相反,我们想要的是 进口是一个简洁的声明 关于我们合作的软件包 带有。

    import java.util.*; import java.sql.*; public class DateDemo { private Date utilDate; private Date sqlDate; }