Eclipse/Java - 导入java是否有害.(命名空间).*?

Jam*_*add 18 java eclipse namespaces

为什么Eclipse在导入类型时会采用细粒度的方法?在C#中,我习惯于使用"使用System.Windows.Controls"并完成它,但Eclipse更喜欢导入我单独引用的每个小部件(使用Ctrl + Shift + O快捷方式).如果我知道我需要多个类型,导入整个命名空间是否有任何损害?

Kri*_*ves 15

Eclipse在Window - > Preferences对话框中有一个很棒的设置叫做"Organize Imports",可以让你说当从包中使用N个类时,进行通配符导入.我通常在N = 2或3时使用它.

  • 任何使用JUnit 4注释的人! (2认同)

axt*_*avt 12

有人可以在没有IDE的情况下读取您的代码 - 在这种情况下,非通配符导入将帮助他找出代码中使用的类.


coo*_*ird 10

如果多个包中存在多个具有相同名称的类,则通配符包导入可能导致的唯一损害是命名空间冲突的可能性增加.

比如说,我想编程ArrayList在AWT应用程序中使用Java Collections Framework 的类,该应用程序使用ListGUI组件来显示信息.为了举个例子,我们假设我们有以下内容:

// 'ArrayList' from java.util
ArrayList<String> strings = new ArrayList<String>();

// ...

// 'List' from java.awt
List listComponent = new List()
Run Code Online (Sandbox Code Playgroud)

现在,为了使用上述内容,必须对这两个类进行导入,最低限度:

import java.awt.List;
import java.util.ArrayList;
Run Code Online (Sandbox Code Playgroud)

现在,如果我们在包中使用通配符import,我们将拥有以下内容.

import java.awt.*;
import java.util.*;
Run Code Online (Sandbox Code Playgroud)

但是,现在我们将遇到问题!

有一个java.awt.List类和一个java.util.List,所以提到这个List类是模棱两可的.List如果我们想要消除歧义,则必须使用完全限定的类名称来引用:

import java.awt.*;
import java.util.*;

ArrayList<String> strings = new ArrayList<String>();

// ...

// 'List' from java.awt -- need to use a fully-qualified class name.
java.awt.List listComponent = new java.awt.List()
Run Code Online (Sandbox Code Playgroud)

因此,有些情况下使用通配符包import会导致问题.


Pas*_*ent 9

import指令是一个编译器指令,它告诉编译器在哪里查找类,并且不必总是使用完全限定的类名,例如java.util.HashMap.但是import指令本身并没有放入编译的字节码文件中,编译器会将完全限定的名称编译到.class文件中.

当使用没有通配符时,该指令显式地告诉编译器在类路径中查找一个特定文件.使用通配符,该指令告诉编译器查找命名包,在每次需要匹配任何名称时在该包中搜索可能的匹配项.对于编译器而言,后一版本可能比前者花费更长时间.

换句话说,该import指令不会以任何方式影响运行时代码的执行.但是,该import指令确实会影响编译时间.另外,我发现使用import通配符会降低代码的可读性.

实际上,javaperformancetuning.com上月份的进口报表成本问题在结论中完美地总结了这一点:

  • 使用import语句没有运行时成本
  • 使用import语句,编译过程可能需要更多时间
  • 使用通配符import语句,编译过程可能需要更多时间
  • 为了提高可读性,通配符导入语句对于除了一次性类之外的任何东西都是不好的做法
  • 非通配符导入语句的编译开销很小,但它们提供了可读性好处,因此最佳实践是使用它们


Kal*_*see 5

我不相信通配符导入会产生任何性能影响(如果确实如此,我认为它只会在编译时发生).但正如这篇SO帖子指出的那样,如果你使用它们,你可能会有类名重叠.

当我使用尚未导入的类时,我只使用Ctrl + Space强制导入,导入会自动进行.然后,在我重构一个类以删除任何不再使用的导入后,我按Ctrl + Shift + O.