在Java中使用完全限定名称和导入之间的区别

时间:2015-10-06 09:09:08

标签: java import inline

使用“内联导入”(完全限定名称)和Java中的性能,内存,编译时间等方面的正常导入是否存在差异?

chooser.setCurrentDirectory(new java.io.File("."));

import java.io.File;
...
   chooser.setCurrentDirectory(new File("."));

6 个答案:

答案 0 :(得分:9)

你应该关注的主要是可读性。我发现第二个更具可读性。

在极少数情况下,我更喜欢第二种方法。让我们考虑以下场景:出于某种原因,我编写了一个类并将其命名为File。我输入了File file = new File(...),我的IDE为我自动导入了java.io.File。但我不想要那种对象,我想要我的 File类。因此,我更喜欢内联导入它,而不是导入正确的类,只是其他用户不会对Java的File类感到困惑。

关于性能,它们完全相同,这是证明 -

这是为第一个片段生成的字节码:

public class java8.tests.General {
  public java8.tests.General();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class javax/swing/JFileChooser
       3: dup
       4: invokespecial #3                  // Method javax/swing/JFileChooser."<init>":()V
       7: astore_1
       8: aload_1
       9: new           #4                  // class java/io/File
      12: dup
      13: ldc           #5                  // String .
      15: invokespecial #6                  // Method java/io/File."<init>":(Ljava/lang/String;)V
      18: invokevirtual #7                  // Method javax/swing/JFileChooser.setCurrentDirectory:(Ljava/io/File;)V
      21: return
}

这是第二个字节码:

public class java8.tests.General {
  public java8.tests.General();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class javax/swing/JFileChooser
       3: dup
       4: invokespecial #3                  // Method javax/swing/JFileChooser."<init>":()V
       7: astore_1
       8: aload_1
       9: new           #4                  // class java/io/File
      12: dup
      13: ldc           #5                  // String .
      15: invokespecial #6                  // Method java/io/File."<init>":(Ljava/lang/String;)V
      18: invokevirtual #7                  // Method javax/swing/JFileChooser.setCurrentDirectory:(Ljava/io/File;)V
      21: return
}

答案 1 :(得分:4)

在性能,内存,编译时方面,两者都不完全相同。它们之间的唯一区别是普通导入可以节省您的打字工作,而且它的可读性更高。

答案 2 :(得分:3)

仅在下列情况下才有意义,

如果您想使用多个包中提供的类。 即日期类在java.util&amp;中可用。 java.sql中

您可以在程序开始时导入上述类之一,并使用另一个类的合格语法。

答案 3 :(得分:2)

如果要在一个类中导入同名的类,您可以明确告诉哪一个使用哪个(完整的类名):

import java.io.File;
...
chooser.setCurrentDirectory(new File(".")); // java.io.File

new org.yourpackage.File("sdfsdf");         // org.yourpackage.File

答案 4 :(得分:2)

不,它不会影响代码的性能。 导入语句使您的代码更具可读性,因为您没有编写所有包名称。 但有时候,你有ClassNames的冲突,那么建议使用合格的名字。

答案 5 :(得分:1)

在java类中,它们始终由最终字节码中的完全限定名称引用。它是第一次创建类的对象(或访问类的静态成员)时发生的。

尽管如此,编译器使用import以非限定名称(MyClass而不是mypackage.MyClass)访问类。

因此,导入类或显式写入完全限定名称之间存在0差异 - 它只是可读性问题,节省了一些输入并有助于防止具有相同名称的类之间发生冲突。