2011-12-18 21 views
6

冗長Java importステートメントの影響は何ですか?Javaでの冗長インポート文の影響は何ですか?

コンパイルされたランタイム(パフォーマンス/サイズ)に影響しますか? またはインテリセンスのようなもの?

別の質問をする: 削除することはどのくらい重要ですか?

+0

ご意見ありがとうございます。 これは非常に参考になりました。 私はコードをきれいに保つ必要があることを認識しています。 これは単なる教育のためだけのものでした。 また、「冗長」という言葉がここでは間違った選択だったと感じています。 私が意味していたのは、もはや必要ではない輸入声明でした。 は、java.util.ArrayListのようなものを使用して、このクラスが使用されなくなるような方法でコードを変更する場合と同じです。 そして、importステートメントがまだ残っているという事実が私のコードを大きくしたり遅くしたりするのであれば、私は迷っていました。 – epeleg

答えて

14

インポートステートメントは、コンパイル時の処理にのみ影響します。

コンパイラはこのコードを取り、実行可能形式(バイナリ形式)でコードを表す.classファイルを作成します。

バイナリはまったく同じですが、作成方法は異なります。

のは、単純なケースを見てみましょう。で使用した場合

import java.util.ArrayList; 
import java.util.List; 

import java.util.*; 

:コンパイラは最初のケースでは、ワードListに当たると

//... 
List <String> someList = new ArrayList <String>(); 
//... 

、そのクラスのセットにListが存在するかどうかを調べる必要があります。ない。 2番目のケースでは、すでに明示的に指定されているので、はるかに簡単です。

本質的に、コンパイラは、importステートメントに存在するすべてのクラスを取り、その名前を追跡して、使用する場合、呼び出している適切な関数を取得できるようにする必要があります。

複数のパッケージに同じ名前のクラスがあることがあります。ここでは、*を使用してディレクトリ内のすべてのクラスを選択しないでください(Thomasが参照している)。

クラスの使用方法を明示的に記述することをお勧めします。

1

最大の危険は名前空間の衝突です。たとえば、2つのインポートされたライブラリの両方にリストタイプがある場合、それはあなたが思うものを使用しないことがあります。

+5

これは間違っています。 'List'をインポートして' java.awt.List'と 'java.util.List'の両方をインポートしたいとしましょう。コンパイラはすでに' List'のための単一のタイプのインポートを持っているので、第2のものについて文句を言います。 'java.awt。*'と 'java.util。* 'をインポートすると、コンパイラは' List'へのあいまいな参照のため失敗します。シナリオを達成する唯一の方法は、1つのシングルタイプと1つのワイルドカードをインポートする場合です。 'java.awt。*'と 'java.util.List' - 単一の型が優先されます。 Java言語仕様[セクション7.5.1](http://java.sun.com/docs/books/jls/third_edition/html/packages.html#7.5)を参照してください。1) – Paul

1

彼らが.javaファイルに肥大化を追加し、IDEを使用している場合は特に指定したファイル内でそれらを取り除くために、迅速かつ安価であるため、それらを除去することが重要である(CTRL - SHIFT - O、私は、Eclipseのショートカットだと思う)。

「冗長なインポートはマシンにとって何をするのですか?」というだけではありません。 クラス自体は、該当するjarファイルに一度だけ追加され、クラスごとに1回読み込まれます(「クラスごとに」参照してください)。プログラム自体に長期的な影響はありません。

これは、安価で問題を解決するのが簡単だということです。IDEを使用していない場合は、明示的にグループ化されたインポートステートメントが必要です。私はただちにjava.util.Mapの2つの輸入品を見ていきます。なぜなら、お互いのすぐ隣にいるからです!)。あなたの仲間のコーダーは、あなたがそれを修正しなければ積極的に同意しますので、そうすることがあなたの最大の関心事であることをお勧めします。

+0

クラス自体は、プログラムにカスタムクラスのロードに関する問題がない限り、1回、期間だけロードされます。 .javaファイルの 'Bloat'は.e.gの場合でも正確ではありません。 'import javax.swing。*'を呼び出すことができます。いずれにしても、それらを削除することは重要ではありません。 – EJP

+1

@EJPこれは完全に正確ではありません。 JVMがクラスをロードする方法のため、複数のブートローダが同じクラスを複数回ロードする可能性は非常に高いです。私が完全には説明していないことを認めているのは微妙なことですが、そうするのは厄介で過度のようでした。 – cwallenpoole

+0

複数の*ローダー*がそれぞれクラスを1回ロードする可能性があり、私はそのような例外的なケースを私のコメントに具体的に提供しています。 – EJP

3

これは、余分なインポートステートメントの実行に影響を与えません。ソースコードを必要以上に長くすることがありますが、コンパイルされたコードには何の影響もありません。 Javaの自体が不要なクラスファイルをインポート - Java Language Specificationsection 7.5.5を参照してください。

各コンパイル単位が自動的に 宣言かのように、事前に定義されたパッケージjava.langで宣言さ 名前パブリック型のすべてをインポート:
import java.lang.*;
各パッケージ文の直後に、各 コンパイル単位の冒頭に現れました。

Section 7.5.2

が要求時の型インポート宣言は、決して他の宣言 が影にすることが生じないことを言います。

...ワイルドカードのインポートは、単一エントリのインポートよりも優先されません。

他の人が指摘しているように、まともなIDE(NetBeans、Eclipseなど)は、使用されていないインポートを削除します。

+0

必ずしもソースコードを長くするとは限りません。 'import javax.swing。*;'はおそらく多くの未使用クラスをインポートしますが、プログラムで使用する各Swingウィジェットを明示的にインポートするよりもかなり短くなります。 –

+0

@テッド、はい、あなたは正しいです、私は私の答えを修正します。 – Paul

2

パフォーマンスに関する多くの質問と同様に、コードの明瞭性は通常より重要です。これはあなたの最初の考えであり、パフォーマンス上の問題が判明しているまれなケースでのみ、最も単純で明確なコードを書かないようにすべきです。

多くのパフォーマンスに関する質問と同様、この場合、最も単純で明瞭なコードも最も高速です。

あなたのimportを維持するか、あなたのIDEがそれらを維持して明瞭に保ち、コードを簡単に保守する必要があります。コンパイラやIDEの場合でも、パフォーマンスの問題は非常に小さいです。