Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.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
Eclipse/Java-导入Java(名称空间)有害吗?_Java_Eclipse_Namespaces - Fatal编程技术网

Eclipse/Java-导入Java(名称空间)有害吗?

Eclipse/Java-导入Java(名称空间)有害吗?,java,eclipse,namespaces,Java,Eclipse,Namespaces,为什么Eclipse在导入类型时采用细粒度方法?在C#中,我已经习惯了“使用System.Windows.Controls”和使用它,但Eclipse更喜欢单独导入我引用的每个小部件(使用Ctrl+Shift+O快捷键)。如果我知道需要在整个名称空间中输入多个类型,那么导入该名称空间有什么害处吗?我不认为通配符导入有任何性能影响(如果有,我认为它只会在编译时发生)。但是这样,如果使用类名重叠,则可能会有类名重叠 当我使用一个尚未导入的类时,我只是使用Ctrl+Space强制导入,并且导入会自动进

为什么Eclipse在导入类型时采用细粒度方法?在C#中,我已经习惯了“使用System.Windows.Controls”和使用它,但Eclipse更喜欢单独导入我引用的每个小部件(使用Ctrl+Shift+O快捷键)。如果我知道需要在整个名称空间中输入多个类型,那么导入该名称空间有什么害处吗?

我不认为通配符导入有任何性能影响(如果有,我认为它只会在编译时发生)。但是这样,如果使用类名重叠,则可能会有类名重叠


当我使用一个尚未导入的类时,我只是使用Ctrl+Space强制导入,并且导入会自动进行。重构一个类后,我按Ctrl+Shift+O键删除不再使用的导入。

有人可以在没有IDE的情况下读取代码-在这种情况下,非通配符导入将帮助他确定代码中使用了哪些类。

不会影响代码。作为一般原则,如果不打算使用,为什么要导入某些内容?

Eclipse在“窗口->首选项”对话框中有一个名为“组织导入”的很棒的设置,允许您在使用包中的N个类时,执行通配符导入。我通常在N=2或3时使用它。

通配符包导入可能造成的唯一危害是,如果多个包中有多个同名的类,则命名空间冲突的可能性会增加

例如,我想编程在AWT应用程序中使用Java Collections框架的
ArrayList
类,该应用程序使用
List
GUI组件来显示信息。为了举例说明,假设我们有以下内容:

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

// ...

// 'List' from java.awt
List listComponent = new List()
现在,如果我们要在包
import
中使用通配符,我们将有以下内容

import java.awt.*;
import java.util.*;
然而,现在我们将有一个问题

有一个
java.awt.List
类和一个
java.util.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()
import java.awt.*;
导入java.util.*;
ArrayList字符串=新的ArrayList();
// ...
//java.awt中的“List”——需要使用完全限定的类名。
java.awt.List listComponent=new java.awt.List()

因此,在某些情况下,使用通配符包导入可能会导致问题。

直到JDK 1.2,此代码可以正常编译:

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

public class Foo
{
    // List is java.awt.List
    private List list;
}
在JDK1.2中,添加了java.util.List,并且不再编译代码,因为编译器不知道需要哪个列表(awt或util)。您可以通过在导入的末尾添加“import java.awt.List;”来修复它,但关键是您必须做一些事情来修复它

我个人使用单一导入而不是按需导入,原因有二:

  • 很清楚每个班级都来自哪里 从
  • 如果你有大量的进口 这个班可能做得太多了 应该分开。这是一个 “代码气味”

  • 从纯粹主义者的角度来看,每次导入都会产生依赖性和潜在冲突。进口被视为一种必要的邪恶,因此它们被最小化。导入另一个带有*的包就像写一张空白支票。导入两个这样的包就像让某人可以在你的账户之间转移资金

    从实用的角度来看,这通常是有意义的,因为不同的项目和库对不同的概念使用了惊人的相似名称。或者,假设您从包A导入所有内容,然后从包B导入所有内容,并使用包B中的某些类C。如果稍后有人将名为C的类添加到包A中,您的代码可能会中断


    尽管如此,我承认我很懒。我通常会预先导入包中的所有内容,然后让Eclipse根据我实际使用的内容来组织它。

    导入包/命名空间中的所有类没有坏处,但我认为最好包含每个单独的类。它使后面的开发人员更清楚地了解每个类的确切来源


    如果您使用的是像IntelliJ这样的功能强大的IDE,那么这不是问题。我认为Eclipse和NetBeans也可以管理导入。它将为您添加代码并从视图中折叠它们,这样它们就不会扰乱窗口。如果您编写一些java代码,例如

    LinkedList<foo> llist = new LinkedList<foo>()  
    
    LinkedList llist=new LinkedList()
    
    如果您尚未将LinkedList导入到项目中,Eclipse将询问您是否要导入它。由于您只使用LinkedList而不使用其他内容,因此它将只导入LinkedList。如果您在同一项目中执行其他操作,例如
    ArrayList alist=new ArrayList()

    然后Eclipse也会说您需要导入ArrayList,而不是其他内容。Eclipse只允许您根据所做的任何库调用导入所需的内容。如果您需要来自同一个库的多个类型或项目,那么使用

    导入java.namespace.*

    带上你需要的其他物品。只要您导入包含您正在引用的项目(如扫描仪、LinkedList等)的包和库,Eclipse就不会在意


    从可读性的角度来看,这是一个不同的问题。如果您希望人们明确地知道您正在导入什么,那么调用每个小部件或包可能是正确的。如果您在标准库中使用同一个包中的许多不同函数,并且文件头很长,因此使用了.*通配符,那么这可能会变得相当乏味。通过通配符导入并没有什么害处,它实际上可以归结为您的编码标准以及您希望类头的透明程度

    导入指令是一个编译器指令,它告诉co
    LinkedList<foo> llist = new LinkedList<foo>()