2015-10-06 9 views
7

Javaのパフォーマンス、メモリ、コンパイル時などの点でインラインインポート(完全修飾名)と通常インポートを使用する場合に違いはありますか?完全修飾名とJavaでのインポートの相違点

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

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

違いはありませんが、2番目の解決策だけが読みやすくなります。そうでなければクラスの競合がある場合にのみ 'inline imports'を使うべきです。 – hotzst

+1

私はあなたがより良い読みやすさのために2番目を使用することをお勧めします。測定結果が悪いとパフォーマンスが悪くなります。 – Kuchi

答えて

9

主なものは、読みやすさです。私は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 
} 
4

ません両方がコンパイル時に、パフォーマンスの面でメモリまったく同じです。それらの間の唯一の違いは、通常のインポートでは入力作業が節約され、読みやすいということです。

2

あなたはで一つのクラス同じ名前のクラスをインポートする場合は、あなたが明示的にどこ(完全なクラス名)を使用するかを伝えることができます:

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

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

いいえ、それはwouldnコードのパフォーマンスに影響しません。 インポートステートメントは、すべてのパッケージ名を記述していないため、コードを読みやすくします。 しかし、ClassNamesの競合がある場合は、修飾名を使用することをお勧めします。

1

Javaクラスは常に、最終バイトコードの完全修飾名で参照されます。これは、クラスのオブジェクトが作成されたとき(またはクラスの静的メンバーがアクセスされたとき)に初めて発生します。

つまり、importは、コンパイル時に、修飾されていない名前(mypackage.MyClassの代わりにMyClass)でクラスにアクセスするために使用されます。

したがって、クラスのインポートと完全修飾名の明示的な区別はありません。これは読みやすさの問題です。一部の型を保存し、同じ名前のクラス間の衝突を防ぐのに役立ちます。

3

それは次のような場合、

で唯一の問題、あなたは倍数パッケージで提供されたクラスを使用したい場合。 つまりDateクラスはjava.util & javaで利用可能です。sql

上記のクラスのいずれかをプログラムの最初にインポートし、別のクラスの修飾された構文を使用できます。

関連する問題