web-dev-qa-db-ja.com

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

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

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

97
Kip

インポートを削除していない場合、パフォーマンスの問題やそのようなことはおそらくないと思います。

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

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

いつも使用されていないコードは、コードを読んでアクティブなコードに何かを残しているときに気を散らすので、後で必要になるかもしれないので、ほとんどが悪い習慣と見なされます。

80
Janusz

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

別の(ただし、これは本質的に非常に具体的です)未使用のインポートに別のインポートと名前の競合があり、完全修飾名を不必要に使用する場合です。

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

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

51
Yishai

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

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

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

いずれにしても、Eclipseにこれらをクリーンアップするよう依頼することができます

9
Uri

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

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

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

3
John

警告? Eclipseに自動的にクリーンアップするよう依頼してください。それがIntelliJの仕事です。警告するほど賢い場合は、それらをクリーンアップするのに十分賢いはずです。 Eclipseの設定を探して、そのようなしつこいことをやめて何かをするように指示することをお勧めします。

3
duffymo

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

プログラムを保守する必要がある場合は、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
OscarRyz

使用されていないインポート文をコメント化して警告を表示することはできませんが、何があったかは確認できます。

2
Sharon

Eclipseの場合は、これを使用します。ウィンドウ->設定-> Java->エディター->アクションの保存->インポートを整理するためのチェックボックスをオンにします(他にも便利なものがたくさんあります。書式設定、フィールドの最終的な作成など)。ファイルを保存すると、Eclipseは不必要なインポートを削除します。私の意見では、必要ない場合は削除します(またはEclipseで削除します)。

2
kukudas

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

Eclipse

Windows/Linux-Ctrl+Shift+O

マック -Cmd+Shift+O

IntelliJ IDEAまたはAndroid Studio

Windows/Linux-Ctrl+Alt+O

マック -Cmd+Alt+O

1
Madan Sapkota

私にとって、コントローラークラスの未使用のクラスインポートは、コードクリーンアップ中にインポートしたクラスを削除し、ローカルでビルドをテストせずにGitで削除をコミットした後、Jenkinsビルドでコンパイルの問題を引き起こしました。

0
Aakash Kedia

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

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

0