プロが教えるわが家の防犯対策術!

・パッケージについて教えてください

■質問1
・ArrayListのパッケージは、どうして「java.util.List」ではなくて「java.util.ArrayList」なのでしょうか?
・ArrayListは、Listインターフェイス実装クラスなのでListに紐付いている、と思ったのですが…
・「java/util/List.interface」と「java/util/ArrayList.class」は並列の位置づけになるのでしょうか?
・そういう決まりだから?
・Listインターフェイスのパッケージ名は下記で確認するのでしょうか?
http://docs.oracle.com/javase/jp/7/api/java/util …

■質問2
・「import java.util.*;」表記ができるなら、全部これで良いようにも思うのですが、どういう風に使い分けるのでしょうか?
・普通はどちらを使う、とかあるのでしょうか?

A 回答 (4件)

■質問1


List インターフェースと ArrayList クラスの両方ともその所属するパッケージは java.util です。java.util.List というパッケージも java.util.ArrayList というパッケージも存在しません。これはそれぞれのインターフェース/クラスの完全限定名というものです。
http://sjc-p.obx21.com/word/jk/fullyqualifiednam …

たしかに List のパッケージ名はあなたが提示されたページで確認できます。ただし、左上に小さく書いてある「java.util」という記述がパッケージ名を表しています。

■質問2
*を使用したインポートはそのパッケージ内にあるすべてのクラス・インターフェースをインポートします。
これは裏を返すとそのソースで実際に使用しないものまでインポートしてしまうことになり、実際に使用されるクラスがなにかをわかりづらくなります。
また、パッケージが Java で導入されたのは C 言語での名前の衝突の多発を反省してのことですが、*を使ってのインポートはその名前の衝突が発生することになります。
したがって、自分は(Eclipse を使用していて、パッケージの整理を Eclipse 任せにしているせいもありますが)積極的に*を使用したインポートを行うケースは稀です。
    • good
    • 0
この回答へのお礼

・回答&リンク提示ありがとうございました。

>完全限定名
・初めて知りました
・大変参考になりましたー

お礼日時:2013/11/05 12:26

 こんにちは。

c#初心者兼、java始めました です。

 実はいうと、自分も質問者様のようにjavaを始めた時はimportの書き方で悩んだことがあります。

 それはさておき、packageというと、ファイルとフォルダをイメージしてもらうと分かりやすいかと(細かい差はありますが)。

 java.util.ArrayListはjavaフォルダの中のutilフォルダの中の、ArrayListファイルだと思ってもらって問題ないかと。
 Listも同じjava.utilの中に入っています。
 つまり、質問者様の考えている通りListとArrayListの置き場所は同じです。
 さらに、Listはファイル(と同じような扱い)なのでその中にArrayListが入ることはできません。
 つまり、インターフェイスだろうが、スーパークラスだろうがファイル(のようなもの)なので、関係する他のクラスと同じpackageに入っているということです。

こんな感じ
+java
  ├util
  | ├ArrayList
  | ├List
  | ├Iterable
  | |
  | …
  |
  ├lang
  | ├String
  | ├System
  |
  ├io
 
 続いて、質問2ですが、
> 「import java.util.*;」表記ができるなら…
 確かにそうかもしれません。実際、c言語系統(c, c++, c#など)ではまとめてインポートが多いです。
 
 が、一長一短で、まとめてインポートするするのは便利な反面、欠点もあります。

 例えばゲームを作るとして、自分でRobotと言うクラスを作っていたとします。そして、ウインドウを使うクラスを作るためにjava.awt.* をインポートしたとします。
 すると、Robotを使おうとしたときにエラーが出ます。なぜなら、実はこのRobot、java.awtにも同じ名前のRobotがあるのです(こっちは自動操作ロボットのような感じ)。
 
 つまり、どちらの名前が衝突してどちらのRobotが判別がつかない状態になってしまいます。
 解決策としては、自分のRobotクラスの名前を変えるとい方法があります。

 しかし、場合によっては不可能なこともあります(既に他のいろいろなプロジェクトで使用済みなど)。
 その場合はjava.awt.Frame など、一部の必要なクラスだけをインポートするしかありません。そのための解決策です。

 個人的には1つ、2つだけなら、一部だけ、多くなりそうな場合はとりあえずまとめてインポート、被ったら一部だけと使い分けています(それが正しいかどうか分かりませんが)。

 お役に立てれば幸いです。
    • good
    • 0
この回答へのお礼

・回答ありがとうございました
・「こんな感じ」のツリーイメージ図が分かりやすかったです
・名前衝突の件も参考になりましたー

お礼日時:2013/11/05 12:37

■質問1


>・ArrayListのパッケージは、どうして「java.util.List」
>ではなくて「java.util.ArrayList」なのでしょうか?

ArrayListのパッケージは、「java.util.List」でも「java.util.ArrayList」でもありません。「java.util」です。Listのパッケージも「java.util」です。質問者さんはパッケージというものを理解されていないのですかね。とにかくただの勘違いです。

また、インターフェイスと実装クラスのパッケージが異なることはありえることです。単なるグループ分けの話です。同じパッケージにする事が多いですが実装クラスが多い場合それ用のパッケージを作ることもあります。またグループ分けする人の気分しだいの場合のありますのであまり気にしないほうがいいでしょう。


■質問2
>・「import java.util.*;」表記ができるなら、
>全部これで良いようにも思うのですが、
>どういう風に使い分けるのでしょうか?
>・普通はどちらを使う、とかあるのでしょうか?

まず*を使ってもコンパイラが判断し余計なものはインポートしません。なので、動作を考えた場合にはどちらでも変わりはありません。

また使い分けというものはありません。人によります。いちいち列挙するのが面倒くさい場合や、ソースが長くなるのが嫌な場合に*を使うのでしょう。しかし、何のクラスを使っていかあいまいで不明確になるためそれが好ましくないと考える人もいるでしょう。人の考え方の問題です。

私は明確にしたほうがいいとは思います。仕事でJavaを扱うのであれば明確にした方がいいでしょうね。学生や個人で自分しか見ないプログラムを作るのであれば*でもいいと思います。

Eclipseを使っている場合にはCtrl+oで一発で整理できますので、個人的な趣味でやっているという場合でもない限りは明示するクセをつけた方がいいように思います。
    • good
    • 0
この回答へのお礼

・回答ありがとうございました

>単なるグループ分けの話です
・なるほど

>*を使ってもコンパイラが判断し余計なものはインポートしません。なので、動作を考えた場合にはどちらでも変わりはありません
・初めて知りましたー

お礼日時:2013/11/05 12:33

インタフェース実装とパッケージは直接関係ありません。



例を挙げると、java.lang.Runnableというインタフェースはjava.lang.Thread、java.util.TimerTask、javax.swing.SwingWorkerなどによって実装されていますが、これだけを見ても、それぞれのクラスが所属するパッケージはバラバラであることが分かります。

逆に、java.util.ArrayListクラスはjava.util.List以外にもjava.io.Serializableやjava.lang.Cloneableなどのインタフェースも実装しています。したがって、インタフェースの実装関係に基づいてArrayListが所属するパッケージを決めることは不可能なのです (一つのクラスは複数のパッケージに所属できない)。
    • good
    • 0
この回答へのお礼

・回答ありがとうございました

>インタフェース実装とパッケージは直接関係ありません
>それぞれのクラスが所属するパッケージはバラバラであることが分かります
・実例を挙げていただいたので分かりやすかったです
・大変参考になりましたー

お礼日時:2013/11/05 12:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!