• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:定数の使用について)

定数の使用について

このQ&Aのポイント
  • 定数の使用についてを質問させていただきます。
  • Bのインターフェイスに宣言されている定数「AORINGO」について、Bインターフェイスのパッケージをインポートするか、AクラスにBインターフェイスをインプリメントすることで使用できると思いますが、両者の違いが分かりません。
  • インポートする際のパッケージの指定方法にもメリットやデメリットがあるのでしょうか?インプリメントのメリットやデメリットも教えていただけると助かります。

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

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答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 をインポートしたことになりますが、アスタリスクのインポートが多くなると、どのクラス・インタフェースがどのパッケージからインポートされているのか、混乱することがあります。

mkim
質問者

お礼

ご丁寧な回答ありがとうございます。 >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 なんかを再確認したい場合など、単一のクラスをインポートする宣言にして おけば、探しやすかったりするような気がします。 いやぁ、色々とおくが深くて、興味深いものです。 大変勉強になります。 ありがとうございます。

その他の回答 (1)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

> そこには、定数しか宣言しないつもりであれば、インターフェイスでもよし?? UKYさんだったら、クラスとどちらを使いますでしょうか?? 定数しか宣言しないとなると、難しいですね。インタフェースを実装(implement)して、あるいはクラスを拡張(extend)することで、定数名だけ書けばアクセスできる、というメリットはありますが、ソースコードを簡略化したいのなら、クラスや変数の名前を全部 1 文字にしてしまった方が…… (←可読性最悪) 私としては、定数というものは何らかのほかのものに付随して、あるいは他のものを補助する形で使われるものだと思っています。定数自身がそれだけで何か役割を果たすというのはまずなくて、大概は何らかのメソッドの引数として、あるいは戻り値として、使われるものだと思うのです。そう考えると、たとえばインタフェースに定数を宣言するにしても、そのインタフェースにはその定数を使った(使うための)何らかのメソッドがある、というのが自然だと思うのです。 javax.swing.SwingConstants なんてのは名前からして定数宣言のためだけのインタフェースですが、中身を見ると実際にはコンポーネントの配置に関する定数を宣言しています。それなら、インタフェースの名前を ComponentArrangement とでもして、コンポーネントの配置を決めるためのメソッドがあるとか、そういうことがあってもいいんじゃないの? ということで…… 実際にはコンポーネントの配置の仕方はクラスによって違うから、一つのメソッドにまとめることはできず、インタフェースにメソッドを宣言することはできないということになりますが、結果的に定数宣言だけに終わってしまうインタフェースとはいえ SwingConstants なんて名前は安直過ぎないか?という気がします。 逆の立場から見ると、java.lang.Cloneable とか java.io.Serializable とか、 定数もメソッドもないようなインタフェースでも、「クローンできる」とか「直列化できる」という「性質」をそれを実装するクラスに与える役割を果たしています。 ……というように考えては見ましたが、やはり明確な答えは私にはわかりません。Java 言語の仕組みがそうなっている以上は、本来とは違ったものの使い方というものが出てきて当然ですし、いつかはそれが逆に主流になるといったこともなくはありません。 まぁとりあえず、私は定数宣言のためだけにインタフェースを使うのはやりたくないということでした。

mkim
質問者

お礼

またまたご回答ありがとうございます。 色々と教えていただき、大変勉強になりました。 結構、人それぞれ考え方があり、そこにはメリットがありますね。 場合によって、使い分けていくようにしたいと思います。 色々と疑問がわいてきて、それにご丁寧に教えていただいて とても、嬉しく思います。 もっと勉強したいと思います。 ありがとうございました。

mkim
質問者

補足

なんか定数の使い方って質問だったのに、インターフェイスの 話になってしまったりで、色々とご迷惑をおかけしました。

関連するQ&A