使用“内联导入”(完全限定名称)和Java中的性能,内存,编译时间等方面的正常导入是否存在差异?
chooser.setCurrentDirectory(new java.io.File("."));
和
import java.io.File;
...
chooser.setCurrentDirectory(new File("."));
答案 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差异 - 它只是可读性问题,节省了一些输入并有助于防止具有相同名称的类之间发生冲突。