乱雑さを減らす以外に、Javaで未使用のインポートをクリーンアップする理由はありますか?


99

Javaで未使用のインポート文を回避する正当な理由はありますか?私が理解しているように、それらはコンパイラーのために存在するので、未使用のインポートの多くはコンパイルされたコードに影響を与えません。混乱を減らし、将来の名前の競合を回避するだけですか?

(Eclipseが未使用のインポートについて警告を出すため、これは私が質問します。これは、クラスの設計が完了したと確信できるまでインポートを削除したくないので、コードを開発しているときにちょっと面倒です。)

回答:


86

インポートを削除しない場合は、パフォーマンスの問題などは起こりそうにないと思います。

ただし、まれにリストインターフェースのインポートなど、名前の競合が発生する可能性があります。

Eclipseでは、常にショートカットを使用して(OSによって異なります-Win:Ctrl + SHIFT + OおよびMac:)COMMAND + SHIFT + O、インポートを整理できます。次に、Eclipseはインポートセクションをクリーンアップして、古いインポートなどをすべて削除します。インポートされたものが再び必要な場合、Eclipseは、でステートメントを完了している間、それらを自動的に追加しますCtrl + SPACE。したがって、クラスで未使用のコードを保持する必要はありません。

いつも未使用のコードは、コードを読んでアクティブなコードに何かを残している間、あなたや他の人の注意をそらすので、後で必要になるかもしれないため、たいていは悪い習慣と見なされます。


22
実際には、WindowsではCtrl + Shift + Oです。
マットボール

1
LinuxではCtrl + Shift + Oも。おそらくBSDでも同じです。
WhyNotHugo 2012年

2
インポートの整理アクションctrl+3にアクセスする別の方法は、(少なくともwindwosで)クリックしてからインポートと入力することです。Ctrl + Shift + Oよりも明らかに遅いですが、特定のショートカットを覚えていなくても、すばやく見つける方法(および覚えているか、見つけようとしている他の多くのアクション)です。
epeleg 2013年

53

1つは、インポートによって参照されるクラスをクラスパスから削除した場合、目的を果たさない愚かなコンパイラエラーが発生しないことです。また、「使用場所」検索を実行しても、誤検知は発生しません。

もう1つ(ただし、これは性質上非常に固有です)は、未使用のインポートが別のインポートと名前の競合を引き起こし、完全修飾名を不必要に使用してしまう場合です。

補遺:今日、ビルドサーバーはメモリ不足エラーでコンパイルに失敗し始めました(テスト実行すらされていません)。これはいつまでも問題なく実行され、チェックインにはビルドプロセスの変更や、これを説明できる重要な追加はありませんでした。メモリ設定(これは64ビットのCentOSで64ビットのJVMを実行しています)をクライアントがコンパイルできる場所をはるかに超えて増やした後、チェックインを1つずつ調べました。

開発者が使用して放棄した不適切なインポートがありました(クラスを使用し、自動インポートして、それが間違いであることに気付きました)。その未使用のインポートは、アプリケーションの完全に別の層を引き出しましたが、IDEはそれらを分離するように構成されていませんが、ビルドプロセスはそうです。その単一のインポートが非常に多くのクラスにドラッグされたため、コンパイラーは、クラスパスに関連する依存ライブラリーを持たずにコンパイルしようとしました。これにより、メモリ不足エラーの原因となる多くの問題が発生しました。未使用のインポートによって引き起こされるこの問題を解決するのに1時間かかりました。


4
@ Yishai、Eclipseを使用している場合は、保存するたびにソースコードを正規化できる保存アクションを調べます。
するThorbjörnRavnアンデルセン

2
@EJP、それらは結果のバイトコードに影響を与えませんが、コンパイラーはそれらを解決して、作成する必要があるバイトコードを理解する必要があります。
Yishai

3
@EJP、付録全体がコンパイル時間について話している(「ビルドサーバーがコンパイルに失敗しました」)。
Yishai

1
インポートだけでこのすべてがどのように引き起こされるのか、まだわかりませんか?
するThorbjörnRavnアンデルセン

1
@Yishaiすみませんが、私はそれを信じていません。あなたはこれを誤診しました。クラスが実際に使用されない限り、インポートはそのような影響を与えません。importステートメントが行うことはすべて、そのクラスがどのパッケージにあるかをコンパイラーに通知することです。コンパイラーは、そのクラスに関する型情報が必要な場合にのみ、暗黙的にコンパイルを試みます。
ローンの侯爵

9

純粋な観点から見ると、依存関係は製品に対する「制約」であり、後でメンテナンスの問題を引き起こす可能性があります。

たとえば、プログラムがcom.XYZObjectPoolクラスを使用していて、後でそれを使用しないことに決めたが、インポートは削除しないと仮定します。他の誰かがorg.WVYObjectPoolをインスタンス化してObjectPoolを参照するだけの場合、キャストの問題または呼び出しの問題が発生するまで、警告は表示されません。

ところで、これは非現実的なシナリオではありません。EclipseにインポートするXの特定のバージョンを尋ねるたびに、多くのパッケージから1つを選択しましたが、そこにインポートしたことがある場合、知らないうちに間違った選択をした可能性があります。

どちらの方法でも、Eclipseにこれらのクリーンアップを依頼できます


3

警告?Eclipseに自動的にクリーンアップするよう依頼してください。これがIntelliJの機能です。あなたに警告するのに十分賢いなら、それはそれらを片付けるのに十分賢いはずです。私はEclipseの設定を探すことをお勧めします。これにより、そんなつまらないことをやめて何かをするように指示できます。


4
それはアクションを保存します。個人的には、Eclipseが明示的に要求した場合にのみコードを変更するのが好きです。
するThorbjörnRavnアンデルセン

1
@Thorbjørn:同意します。特に、少しの間使用をやめましたが、まもなく再び追加される予定のクラスの場合はそうです。
ドナルフェロー

2
@Donal、まあ、それがCtrl-Spaceの目的です。
するThorbjörnRavnアンデルセン

3

これは、メンテナンスに役立つプログラムの明確さに関係しています。

プログラムを保守する必要がある場合は、1行に1つのクラスをインポートすると便利です。

次のシナリオについて考えてみます。

import company.billing.*;
import company.humanrerources.*;

// other imports 


class SomeClass {
      // hundreds or thousands of lines here... 
    public void veryImportantMethod() {
      Customer customer;
      Employee comployee;
      Department dept. 
      // do something with them
     }
 }

コードの一部をバグ修正または保守している(またはコードを読んでいるだけの)場合、使用するクラスがどのパッケージに属しているかを読者が知ることは非常に役立ちます。上記のようにワイルドカードインポートを使用しても、その目的には役立ちません。

IDEを使用している場合でも、ホバーしたり宣言にジャンプしたりしたくない場合は、現在のコードが依存している他のパッケージやクラスを機能の観点から理解すると簡単です。

これが個人的なプロジェクトや小さなプロジェクトの場合、それは本当に問題ではありませんが、他の開発者が使用する必要がある(そして何年にもわたって維持される)大きなプロジェクトの場合、これは必須です。

パフォーマンスの違いはまったくありません。


3

参考までに、これは私を見つけました、インポートを整理することは実際に未使用のインポートを削除するとは思わなかったので、単にそれらをソートしたと思いました。

保存操作中にインポートを自動的に削除すると、たとえば開発中またはテスト中に問題が発生してコードをコメントアウトしたときに、いくつかの悲しみを引き起こしました。保存すると、コードのコメントアウトされたセクションで使用されているインポートが削除されます。変更を元に戻す(Ctrl+ Z)ことができるため、これは問題にならない場合がありますが、他の変更を行った場合ほど簡単ではありません。また、コードのコメントを解除すると(以前にコメントアウトして保存したため、そのコードのインポートを削除しました)、必要なインポートを自動的に推測し、間違ったものをピックアップしました(たとえば、StringUtilsクラスが使用されていて、間違ったライブラリから同じ名前の別のクラスが選択されていました)。

インポートを保存アクションとしてではなく、手動で整理することを好みます。


2

日食のために私はこれを使用します:ウィンドウ->設定-> java->エディター->保存アクション->インポートを整理するためのチェックボックスをチェックします(フォーマット、フィールドを最終的にするなど、他にもたくさんの便利なものがそこにあります。 。)。したがって、ファイルを保存すると、EclipseはUnessacryインポートを削除します。私の意見では、あなたが何かを必要としない場合は、それを削除します(またはそれを日食で削除させます)。


2

未使用のインポート文をコメントアウトすることができ、警告は気になりませんが、何があったかを確認できます。


2
@DimaSan実際にあります。質問では、クラスの設計が完了したと確信できるまで、インポートを削除したくない
Vee

1

パフォーマンスに影響はありませんが、読みやすくするためにクリーンにすることができます。未使用のインポートの削除は、EclipseとIntelliJ IDEAのどちらでも非常に簡単です。

日食

Windows / Linux-    Ctrl+ Shift+O

Mac-                        Cmd+ Shift+O

IntelliJ IDEAまたはAndroid Studio

Windows / Linux-    Ctrl+ Alt+O

Mac-                        Cmd+ Alt+O


0

何年か前に、インポートされたすべてのクラスが実行時にインポートされたクラスでロードされることをどこかで読みました。したがって、未使用のパッケージ、特にパッケージ全体を削除すると、メモリのオーバーヘッドが減少します。私はJavaの最新バージョンがそれを処理すると思いますが、おそらくそれはもう理由ではありません。

ところで、EclipseではCtrl+ Shift+ Oを使用してインポートを整理できますが、Javaファイルを保存するたびに、そのようなこと(およびその他多くのこと)を処理する「クリーナー」を構成することもできます。


うーん..私はそれがビヘイビアだったとしたら驚きます..私は、クラスが初期化されない(つまり、静的イニシャライザを呼び出す)のは、初めて使用するか、カスタムローダーによって明確に要求されるまでです。しかし、「ロード」によって「メモリに読み込まれるが処理されない」ことを意味する場合、それは可能です。
キップ2013年

実際には、さらに考えれば、テストはかなり簡単なはずです。未使用のインポートでコードをコンパイルし、「逆コンパイル」ツールを使用して、未使用のインポートがまだあるかどうかを確認します。そうでない場合は、コンパイラーによって削除されるか、プログラマーの便宜のためにそこにあります。
キップ2013年

4
一体どこで読んだの?それは完全かつ完全に間違っており、常にそうでした。コードによって参照されるすべてのクラスが読み込まれます。インポート含まれません
ローンの侯爵

0

私にとって、コードのクリーンアップ中にインポートされたクラスを削除し、ローカルでビルドをテストせずにgitで削除をコミットした後、コントローラークラスの未使用のクラスインポートによってJenkinsビルドでコンパイルの問題が発生しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.