【Java】オンデマンドインポートはやめるべき理由

オンデマンドインポートとは、import パッケージ名の後にアスタリスク(*)を付ける宣言文です。

import java.util.*;
import java.sql.*;
import javax.swing.*;

オンデマンドインポートは、同じパッケージで複数のクラスを用いる際、一行で記述できます。

その反面、デメリットが大きいです。

そのデメリットを紹介します。

その1:どのクラスを使っているか分かりづらい

まず、サンプルコードを見てください。

package site.climateinfo;
import java.util.*;
import java.sql.*;

public class Main{
    public static void main(String[] args){
        Timer time = new Timer();
    } 
}

上記のTimerクラスは、どのパッケージなのか、すぐ見ただけでは分かりません。

java.utilパッケージのクラスなのか、java.sqlパッケージのクラスなのか、はたまた同じパッケージクラスなのかわかりづらいです。

その2:異なるパッケージでも同名クラス

Timerクラスは、java.utilパッケージとjavax.swingパッケージに存在します。

では、下記のようにオンデマンドインポートでTimerクラスをインスタンス化するとどうなるでしょうか。

package site.climateinfo;
import java.util.*;
import javax.swing.*;

public class Main{
    public static void main(String[] args){
        Timer time = new Timer();
    }
}

実行結果

error: reference to Timer is ambiguous
both class javax.swing.Timer in javax.swing and class java.util.Timer in java.util match

どちらのクラスを呼び出せばよいのか分からず、エラーになりました。

その3:自作パッケージを優先

自作パッケージ(site.climateinfo)に同名のクラスがあったらどうなるでしょうか。

自作パッケージにTimerクラスを作ってみます。

package site.climateinfo;

public class Timer{
   //処理
}

その後、先ほどのコードを実行します。

すると、エラーになりません。

このことからオンデマンドインポートしたパッケージと自作パッケージ(site.climateinfo)に同名クラスがある場合、自作パッケージのクラスを優先することがわかります。

まとめ

オンデマンドインポートのデメリットについて紹介しました。

以上のデメリットからオンデマンドインポートより明示したインポートを利用することをお勧めします。

個人的にオンデマンドインポートは、単純なプログラムのみで使用するならいいと思います。