• ベストアンサー

*でimportするのと、クラス名まできちんと指定するのと

Javaの開発経験は2年くらいですが、未だに疑問でした。 例えばVectorクラスを使いたいとき import java.util.Vectorとする人もいれば、 import java.util.* としてしまう人もいますよね。 前者の人は使うクラスが増えるたびに、丁寧にクラス名でインポートします。*は一切使いません。 やっぱりこの方がメモリを食わない、等の理由でよいのでしょうか?特に最近、こういうソースを良く見かけます。

noname#240292
noname#240292
  • Java
  • 回答数1
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

メモリと速度は関係ないはずです。 これはプログラミングスタイルの問題です。 いちいちクラス名を記述するやり方だと、 別のパッケージでクラス名の重複があったとき対処しやすい、 あるいは重複に気付きやすいため、 こちらの方が上品なやり方だとされています。 (たとえば、java.utilのTimerとSwingのTimerはよくかぶります) 対して、import ...*;でインポートするやり方は、 書くのは簡単だけどあとで混乱するおそれがあります。 後者は、楽だけれど、 「バグを起こしやすいじゃないか!」 といわれると反論できません。 それで前者が推奨され、広まっているようです。 (私自身は、前者の方がいいのはわかっているけれど、 無精なのでついつい*を使ってしまいます)

noname#240292
質問者

お礼

なるほど、メモリとは関係なく、上品なんですね。 よくわかりました。 最近担当しているエンドユーザーはソースをチェックしたりするので、それでこういうのを厳密にしているのかもしれないです。 ありがとうございました。

関連するQ&A

  • import について

    Eclipseで開発しています。 以下2点がImportでエラーになります。 import java.util.* import java.io.*; 以下はImport可です。 import java.lang.reflect.*; import javax.servlet.http.*; import org.apache.struts.action.*; import java.util.*; ライブラリーが足らないのかと思うのですが、よくわかりません ご指導願います。

    • ベストアンサー
    • Java
  • import 文

    import 文では import java.util.* としたり import java.util.ArrayList などのようにクラスごとに指定したりしますが、 この二つの違いとして 大抵の状況で 体感できるほどの速度の差なんてないですよね? つまり、java.util.* としたからと言って、アプリケーションに影響を与えるほど速度が遅くなると言うことはないですよね。

    • ベストアンサー
    • Java
  • Scannerクラスについて

    僕はeclipse3.2を使っています。 Scannerクラスを使うためにjava.util.*をインポートしたのですが、 java.utilにScannerがみつからないというエラーが出たのですが、どうしたらいいのでしょうか?

    • ベストアンサー
    • Java
  • import文はルートクラス指定とサブクラス指定では処理・モジュールサイズに影響?

    ■質問1: import文はルートクラス指定とサブクラス指定では処理・モジュールサイズに影響するのでしょうか? 例えば、 (A)import java.util.Date; と (B)import java.util.*; では、何かしらの変化があるのでしょうか? import文はコンパイル時のクラスライブラリへの参照、という意味では コンパイル速度への影響は考えられますが、実処理へは、、、どうなのでしょうか? またこのことによるモジュールサイズには影響がおこりえますか? (import文一行では変化がないかもしれませんが、大量の場合) ご存知なかたいらっしゃいましたら、是非教えて頂けますようよろしくお願いいたします。

    • ベストアンサー
    • Java
  • Importしたクラスとメモリとの関係は

     こんにちは、JAVA初心者です、宜しくお願いします。  JAVAでクラスをImportしますが、これはどのような意味でしょうか。 (メイン)メモリの上に呼び出されると いうことでしょうか。  インスタンス化したクラスはメモリの上で領域を確保するとありますが、Importしたクラスはコンパイルまでは どのような状態なのでしょうか。

  • Scannerクラスについて

    今現在、Visual J#を使ってJavaの勉強をしているのですが、 Scannerクラスをインポートすると以下のメッセージが出ます。 エラー'java.util.Scanner' が見つかりません。 Visal J#ではScannerクラスは使用できないのでしょうか? 御回答よろしくお願いします。

    • ベストアンサー
    • Java
  • クラス名正しいのにNoClassDefFound:

    TomcatとEclipseでwebアプリ開発を勉強している者です。 jspに持っていく前に、主要なメソッドがちゃんと動作するかどうかをテストしていましたら、 以下のように、コンパイルは出来ても実行時のコマンド結果が上手くいかず、さらに(2)のコマンド結果にも腑に落ちず、とても困ってます。。 以下が問題のコードの構成です。 ・FavoriteSearch.java package mangasearch; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.*; class FavoriteSearch{ public static void main(String[] args) throws IOException{ //メインメソッド } 《コンパイル時》 C:\tomcat7\webapps\mangasearch\WEB-INF\src\mangasearch>javac -classpath C:\tomca t7\webapps\mangasearch\WEB-INF\src FavoriteSearch.java →成功 実行時 (1)C:\tomcat7\webapps\mangasearch\WEB-INF\src>java -classpath C:\tomcat7\webapps\ma ngasearch\WEB-INF\src mangasearch\FavoriteSearch ↓ Exception in thread "main" java.lang.NoClassDefFoundError: mangasearch\FavoriteS earch (wrong name: mangasearch/FavoriteSearch) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 【コマンドの動機】 ・パッケージを宣言しているので、カレントディレクトリをFavoriteSearch.classがあるディレクトリより階層をひとつ上にする。 ・mangasearchパッケージをsrcフォルダから探させる。 ・パッケージ名をクラス名の前に\をつけ、添える。 参考サイト http://javafaq.jp/S003.html でjava.lang.NoClassDefFoundError:については調べたのですが、クラス名もあっていますし、どうしてこのようなエラーが出るのかが分かりません。。 (2)C:\tomcat7\webapps\mangasearch\WEB-INF\src\mangasearch>java -classpath C:\tomcat 7\webapps\mangasearch\WEB-INF\src FavoriteSearch ↓ エラー: メイン・クラスFavoriteSearchが見つからなかったかロードできませんでした 【コマンドの動機】 ・カレントディレクトリにコンパイルしたFavoriteSearch.classがある。 ・mangasearchパッケージをsrcフォルダから探させる。 (2)は恐らく結果的に(1)以前の問題だと思われるのですが、どこが問題なのかイマイチ分かりません。。 稚拙な質問かとは思いますが、ご教授のほど、よろしくお願いいたします。 -参考- 階層図(概略)は以下のようになります。 ■tomcat7 |-■mangasearch(プロジェクトフォルダ) |-■bin |-■src |-■work |-■engine |-■WEB-INF     |-■classes     | |-■mangasearch(パッケージフォルダ) | → Manga.class / MangaMgr.class     |-■lib     |-■src        |-■mangasearch(パッケージフォルダ)          → FavoriteSearch.java / FavoriteSearch.class /Manga.java / TagSearch.java /  *今はテストとしてコマンドプロンプト上でコンパイル・実行をしていますのでsrcフォルダに便宜上FavoriteSearch.classがあります。

    • ベストアンサー
    • Java
  • Dimensionクラスの使い方

    Javaを始めたばかりの者です。 参考書を読みながら進めていて下記のソースコードで Dimensionクラスを使用している箇所で行き詰まりました。 使われていたのは、以下のコード --------------------------------------------------------------------------------------------------------------------- import java.awt.*; import javax.swing.*; import java.util.*; class xxx{  static public void main(String[] argv){  /*標準入力からmsgに文字列を入力*/  String msg = scan.next();  /*JLabelクラス型のオブジェクト型変数を作成し、インスタンスを生成*/  JLabel label = new JLabel(msg);  /*JLabelのインスタンスのコンストラクタに入力されたmsgのサイズを取得*/  Dimension dim = label.getPreferredSize();  ・・・etc  } } ---------------------------------------------------------------------------------------------------------------------- 自分が今まで使ってきたクラスは下記のような感じで使っていましたが、ここではnewしていない。 これは、どういうことなんでしょうか? クラス名 dim = new クラス名(); インスタンス作成 = コンストラクタの呼び出し。 new演算子はクラスのコンストラクタを呼び出している理解ですが Dimension dim = label.getPreferredSize(); 上記のコードではDimentionクラスのインスタンスは作られていないということだと思います。 ということは、 ここでは何をしているのでしょうか? どなたか、教えて下さい。

    • ベストアンサー
    • Java
  • コレクションクラスについて

    ●下記のコードについて質問があります import java.util.*; public class Test { public static void main(String args[]) { ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); list.add(new ObjectOne()); list.add(new ObjectOne()); list.add(new ObjectOne()); Collections.sort(list); } } class ObjectOne { private int x = 0; private int y = 0; } このソースをコンパイルすると、 シンボル: メソッド sort(java.util.ArrayList<ObjectOne>) 場所 : java.util.Collections の クラス Collections.sort(list); と、エラーが表示されてしまいます。 java.util.*をインポートしているので、上記のようなエラーはでないと 思うのですが、うまくいかないです。おそらく、ObjectOneクラスで 何か処理漏れが起きているのかもしれませんが、エラーとなる原因を 特定することができません。 エラーとなる原因と解消する手立てを教えていただければと思っております。 宜しくお願い致します。 「追記」 ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); の<ObjectOne>を消せばエラーはなくなりますが、 <ObjectOne>を消さない方針で考えがあればと思っております。

  • ファイルからの入力 Scannerクラス

    ファイルの内容を読み込むプログラムをJavaで作成しています。 Scannerクラスを利用するため、以下のようにimport宣言しました。 package bc; import java.util.Scanner; class FileScanner {  コンストラクタ{   }  メソッド{   }    :    :  mainメソッド{   } } という感じで書いているのですが、この場合のメソッド名は、 Scannerクラスで定義されている名前でないとダメなのでしょうか? 自分で作った名前でメソッドを定義したのですが、 Scannerクラスで定義されていません。 というようなエラーが返ってきてうまくいきません。 どなたか、ご教授くださいm(_ _)m

    • ベストアンサー
    • Java

専門家に質問してみよう