こんばんは。
ふと疑問に思ったので、質問させていただきます。
Aと言うクラス(Class)があったとします。
Bと言うインターフェイス(Interface)があったとします。
このBのインターフェイスに「AORINGO」と言う定数が宣言
されています。
「AORINGO」を使用したい場合、Bと言うインターフェイスの
パッケージをインポート(import)すれば、B.AORINGOと言うように、
「インターフェイス名」+「定数名」でアクセスできますよね。
また、AクラスにBのインターフェイスをインプリメント(implements)
すればそのまま定数名だけ(AORINGO)で使用できますよね。
これって何が違うのでしょうか??
定数名だけで使える方が、楽な気がするのでインプリメントしちゃうのが
いい感じがするのですが。。。
そもそもインポート(import)すると、そのクラスが呼ばれた時にインポート
されているパッケージが読み込まれるのでしょうか??
インプリメント(implements)することによるメリット、デメリット等、
動き的な所がいまいち、理解できていません。
また、インポートする際に、アスタリスク(*)で宣言すると、そのパッケージ
を指す事になると思いますが,単一のパッケージだけを指定する方が良いのでしょうか??
その辺のメリット、デメリット等も教えていただけると助かります。
よろしくお願い致します。
#わかりにくい文章となって、すいません。。
No.1ベストアンサー
- 回答日時:
> 定数名だけで使える方が、楽な気がするのでインプリメントしちゃうのが
いい感じがするのですが。。。
たしかに定数名だけでアクセスできるようになりますが、本来インタフェースというものはそのような使い方をするものではありません。あくまでも、そのインタフェースを実装するクラスがそのインタフェースのメソッドを実装しているということを保証するためのものです。たとえば、java.lang.Comparable インタフェースは、それを実装するクラスは compareTo メソッドを必ず持っている、ということを示すために使われます。
javax.swing.SwingConstants インタフェースのように、定数に簡単にアクセスできるようにするためのインタフェースもありますが、余り感心しません。定数を宣言するだけなら、単なるクラスでもできるからです。
> そもそもインポート(import)すると、そのクラスが呼ばれた時にインポート
されているパッケージが読み込まれるのでしょうか??
いいえ。読み込まれるのはあくまでもインポートされたクラスだけです。
で、インポートとインプリメントとの直接のかかわりはありません。
インポートは、単にクラス・インタフェースの名前をフルネームで書かなくてもよくするだけのことです。例えば、「import java.util.Vector;」とインポートすれば、「Vector」と書くだけで Vector クラスにアクセスできますが、インポートしなくても、「java.util.Vector」というようにフルネームで書けば、Vector にアクセスできます。
> また、インポートする際に、アスタリスク(*)で宣言すると、そのパッケージ
を指す事になると思いますが,単一のパッケージだけを指定する方が良いのでしょうか??
「単一のパッケージ」ではなく、「単一のクラス・インタフェース」ですね。
インポートするときにアスタリスクを使うと、そのパッケージ全体(サブパッケージを除く)を指すことになりますが、できれば、クラス・インタフェースを一つ一つインポートした方がよいです。
「import java.util.*;」としても、「import java.util.Vector;」としても、結果的に Vector をインポートしたことになりますが、アスタリスクのインポートが多くなると、どのクラス・インタフェースがどのパッケージからインポートされているのか、混乱することがあります。
ご丁寧な回答ありがとうございます。
>javax.swing.SwingConstants インタフェースのように、定数に簡単に
>アクセスできるようにするためのインタフェースもありますが、余り感心
>しません。定数を宣言するだけなら、単なるクラスでもできるからです。
これって、意外とやってました(^^;)
ある種の定数を一箇所のインターフェイスにまとめて、AAAAAConstansなんて。。
あんまり、よろしくない考え方でしょうか?
そこには、定数しか宣言しないつもりであれば、インターフェイスでもよし??
UKYさんだったら、クラスとどちらを使いますでしょうか??
(インタフェースを実装するクラスがそのインタフェースのメソッドを実装
しているということを保証するためと言う考え方を知った上で、あえて聞いて
みたいなぁ~と。)
>いいえ。読み込まれるのはあくまでもインポートされたクラスだけです。
>で、インポートとインプリメントとの直接のかかわりはありません。
>インポートは、単にクラス・インタフェースの名前をフルネームで書かなくても
>よくするだけのことです。例えば、「import java.util.Vector;」と
>インポートすれば、「Vector」と書くだけで Vector クラスにアクセス
>できますが、インポートしなくても、「java.util.Vector」というように
>フルネームで書けば、Vector にアクセスできます。
そうですね!!フルで書けばアクセスできますよね!
勉強になります。もし、フルで「java.util.Vector」と書くとソースが
長くなり可読性が落ちるというデメリットがありますが、メリットとしては、
どのパッケージのクラスかがわかる と言う考え方でよいでしょうか??
>「単一のパッケージ」ではなく、「単一のクラス・インタフェース」ですね。
すいません。間違えました(^^;)
>「import java.util.*;」としても、「import java.util.Vector;」と
>しても、結果的に Vector をインポートしたことになりますが、アスタリスク
>のインポートが多くなると、どのクラス・インタフェースがどのパッケージから
>インポートされているのか、混乱することがあります。
そうですね!テストしてるときなんかにエラーが出て、そのクラスのAPI
なんかを再確認したい場合など、単一のクラスをインポートする宣言にして
おけば、探しやすかったりするような気がします。
いやぁ、色々とおくが深くて、興味深いものです。
大変勉強になります。
ありがとうございます。
No.2
- 回答日時:
> そこには、定数しか宣言しないつもりであれば、インターフェイスでもよし??
UKYさんだったら、クラスとどちらを使いますでしょうか??
定数しか宣言しないとなると、難しいですね。インタフェースを実装(implement)して、あるいはクラスを拡張(extend)することで、定数名だけ書けばアクセスできる、というメリットはありますが、ソースコードを簡略化したいのなら、クラスや変数の名前を全部 1 文字にしてしまった方が…… (←可読性最悪)
私としては、定数というものは何らかのほかのものに付随して、あるいは他のものを補助する形で使われるものだと思っています。定数自身がそれだけで何か役割を果たすというのはまずなくて、大概は何らかのメソッドの引数として、あるいは戻り値として、使われるものだと思うのです。そう考えると、たとえばインタフェースに定数を宣言するにしても、そのインタフェースにはその定数を使った(使うための)何らかのメソッドがある、というのが自然だと思うのです。
javax.swing.SwingConstants なんてのは名前からして定数宣言のためだけのインタフェースですが、中身を見ると実際にはコンポーネントの配置に関する定数を宣言しています。それなら、インタフェースの名前を ComponentArrangement とでもして、コンポーネントの配置を決めるためのメソッドがあるとか、そういうことがあってもいいんじゃないの? ということで……
実際にはコンポーネントの配置の仕方はクラスによって違うから、一つのメソッドにまとめることはできず、インタフェースにメソッドを宣言することはできないということになりますが、結果的に定数宣言だけに終わってしまうインタフェースとはいえ SwingConstants なんて名前は安直過ぎないか?という気がします。
逆の立場から見ると、java.lang.Cloneable とか java.io.Serializable とか、
定数もメソッドもないようなインタフェースでも、「クローンできる」とか「直列化できる」という「性質」をそれを実装するクラスに与える役割を果たしています。
……というように考えては見ましたが、やはり明確な答えは私にはわかりません。Java 言語の仕組みがそうなっている以上は、本来とは違ったものの使い方というものが出てきて当然ですし、いつかはそれが逆に主流になるといったこともなくはありません。
まぁとりあえず、私は定数宣言のためだけにインタフェースを使うのはやりたくないということでした。
またまたご回答ありがとうございます。
色々と教えていただき、大変勉強になりました。
結構、人それぞれ考え方があり、そこにはメリットがありますね。
場合によって、使い分けていくようにしたいと思います。
色々と疑問がわいてきて、それにご丁寧に教えていただいて
とても、嬉しく思います。
もっと勉強したいと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++でのヘッダーファイルの循環...
-
「ラッパークラス」の存在意義...
-
VB DLLプロジェクトについて
-
Commons-Discovery.jarとは?
-
C# 「データが失なわれる可能性...
-
C#からDLLを呼びたいのですが・...
-
Javaでは多重継承ができない、...
-
「継承されたメソッドの可視性...
-
オブジェクト指向の壁
-
ワイルドカードマッチング
-
インターフェイス 型変換 クラス
-
抽象クラスのエラーが出ます
-
javaのabstractの意味
-
継承したメソッドのドキュメン...
-
WPF C# PointToClient
-
RPGゲーム オブジェクト指向
-
c# この高速化の方法あり?
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ラッパークラス」の存在意義...
-
C# 「データが失なわれる可能性...
-
VB DLLプロジェクトについて
-
抽象クラスをJUNITでテストする...
-
「継承されたメソッドの可視性...
-
インターフェースとトレイトっ...
-
c++でのヘッダーファイルの循環...
-
JavaでのAPIの覚え方ってみさな...
-
(vba)他のアプリケーションの右...
-
ASP.NETでの共通コードの書き方...
-
なぜForm型にキャストするので...
-
vb.net 自作プロパティの削除に...
-
【C#】クラスのコンストラクタ...
-
委譲って何ですか?
-
interface,extend,implementの...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
Commons-Discovery.jarとは?
-
JTextFieldの入力制限
-
C#からDLLを呼びたいのですが・...
おすすめ情報