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

ugu*_*kan 7 java import inline

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

chooser.setCurrentDirectory(new java.io.File("."));
Run Code Online (Sandbox Code Playgroud)

import java.io.File;
...
   chooser.setCurrentDirectory(new File("."));
Run Code Online (Sandbox Code Playgroud)

Mar*_*oun 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
}
Run Code Online (Sandbox Code Playgroud)

这是第二个的字节码:

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
}
Run Code Online (Sandbox Code Playgroud)