Javaのパフォーマンス、メモリ、コンパイル時などの点でインラインインポート(完全修飾名)と通常インポートを使用する場合に違いはありますか?完全修飾名とJavaでのインポートの相違点
chooser.setCurrentDirectory(new java.io.File("."));
と
import java.io.File;
...
chooser.setCurrentDirectory(new File("."));
Javaのパフォーマンス、メモリ、コンパイル時などの点でインラインインポート(完全修飾名)と通常インポートを使用する場合に違いはありますか?完全修飾名とJavaでのインポートの相違点
chooser.setCurrentDirectory(new java.io.File("."));
と
import java.io.File;
...
chooser.setCurrentDirectory(new File("."));
主なものは、読みやすさです。私は2番目のものをもっと読みやすくします。
まれに、私は第2のアプローチを好まれます。以下のシナリオを考えてみましょう:何らかの理由で、私はクラスを書いて、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
}
ません両方がコンパイル時に、パフォーマンスの面でメモリまったく同じです。それらの間の唯一の違いは、通常のインポートでは入力作業が節約され、読みやすいということです。
あなたはで一つのクラスを同じ名前のクラスをインポートする場合は、あなたが明示的にどこ(完全なクラス名)を使用するかを伝えることができます:
import java.io.File;
...
chooser.setCurrentDirectory(new File(".")); // java.io.File
new org.yourpackage.File("sdfsdf"); // org.yourpackage.File
いいえ、それはwouldnコードのパフォーマンスに影響しません。 インポートステートメントは、すべてのパッケージ名を記述していないため、コードを読みやすくします。 しかし、ClassNamesの競合がある場合は、修飾名を使用することをお勧めします。
Javaクラスは常に、最終バイトコードの完全修飾名で参照されます。これは、クラスのオブジェクトが作成されたとき(またはクラスの静的メンバーがアクセスされたとき)に初めて発生します。
つまり、import
は、コンパイル時に、修飾されていない名前(mypackage.MyClass
の代わりにMyClass
)でクラスにアクセスするために使用されます。
したがって、クラスのインポートと完全修飾名の明示的な区別はありません。これは読みやすさの問題です。一部の型を保存し、同じ名前のクラス間の衝突を防ぐのに役立ちます。
それは次のような場合、
で唯一の問題、あなたは倍数パッケージで提供されたクラスを使用したい場合。 つまりDateクラスはjava.util & javaで利用可能です。sql
上記のクラスのいずれかをプログラムの最初にインポートし、別のクラスの修飾された構文を使用できます。
違いはありませんが、2番目の解決策だけが読みやすくなります。そうでなければクラスの競合がある場合にのみ 'inline imports'を使うべきです。 – hotzst
私はあなたがより良い読みやすさのために2番目を使用することをお勧めします。測定結果が悪いとパフォーマンスが悪くなります。 – Kuchi