アプリ版:「スタンプのみでお礼する」機能のリリースについて

Javaを学習している初心者です。

インタフェース、コンストラクタ、クラスの継承について、
必要な理由が、イマイチよく分かりません。

特に設定しなくても、プログラムは動くと思うのですが・・・
(特にインタフェース)

詳しい方、教えて下さい。

A 回答 (3件)

・コンストラクタ


コンストラクタがないと、インスタンスの初期化処理は、別にメソッドなどで用意し、newしたらそれを呼び出すような形になる。となると、初期化メソッドの呼び忘れでエラーになったりするトラブルが続出するだろう。newすれば自動的に実行されるコンストラクタがあることで、安心してインスタンスが作れる。

・継承
例えば、AWTとかSwingとかのGUIを使って、ウインドウを表示したプログラムを作る場合、継承を利用すれば、FrameやJFrameといった、既に用意されているウインドウの土台となるクラスを継承して簡単に作れる。、継承がないと、ウインドウを作り、各種のイベントに応じて表示を更新したり動かしたりする処理をすべて自分で書かないといけない。すべてにおいて、そうやって「全部、一から作る」ことになる。ウインドウを表示してボタンをクリックして何か実行、なんてものは、継承を使えばせいぜい数十行でできるが、継承がなくすべて自分で実装するとなると、下手すると千行以上書かないといけない。

・インターフェース
例えば、ウインドウを使ったプログラムで、ボタンをクリックしたらこれこれの処理をする、というような場合、ActionListenerを組み込んで処理を作る。これは、考えてみると不思議なことだ。ボタンには、ActionListenerなんて入っていない。が、これをaddすると勝手にリスナーを認識して動く。ということは、ボタンは、ActionListenerが入っていないのに、「もし、これにActionListenerが組み込まれたらこう動く」ということをあらかじめ想定して作られている、ということになる。これは、インターフェースにより「こういうふうな機能を持っているもの」ということをあらかじめ定義しておくことができるから可能なことだ。インターフェースにより、さまざまな部品の定義だけをあらかじめ用意し、(実際のクラスはまだないのに)それがあるものとしてプログラムを作っていける。そして、後から必要に応じて実際のクラスを作って設定すれば、ちゃんと動いてくれる。インターフェースを実装しさえすれば、どんなクラスでもそこにはめ込んで動かせる。こういうプログラムをプラグイン的に組み合わせてちゃんと動くようにできるのは、インターフェースがあるからこそだ。
    • good
    • 0

確かにインターフェースや継承を使わなくてもプログラムは作れます。


ですが、便利な機能であるのに敢えて使わない理由も無いでしょう。
ほとんどの場合インターフェースや継承を使った方が
効率的に設計・製造できますし、何よりフレームワークやAPIなど
既存の便利な仕組みを活用することができます。
例えばjava.utilのListインターフェースなどですね。

コンストラクタはどう考えても必要でしょう。
Javaの言語仕様上、明示的であるにしろないにしろ
コンストラクタを使わずにインスタンスを作ることは
推奨されませんし、通常はまず行いません。
逆にコンストラクタを使わなくてよいのでは、
との考えに至った経緯を知りたいです。
    • good
    • 0

単純な例題などでは必要性を感じないでしょうね。

実際不要だし…
しかし、プロジェクトが複数で、パッケージが200~300、ソースが
2000以上などと言う規模になると、必要になってきます。

コンストラクタ
早い話がクラスの初期設定です。不要なら空の記述でかまいません。
ただ、面白い使い方があります。コンストラクタの属性をprivate、
あるいは「無し」にします。前者は特定の方法でしかインスタンスを
作れないようにする、後者は同一パッケージ内でのみインスタンスを
作れるようにする場合です。プロジェクトが大きく、これに携わる
プログラマの技量にバラつきがある場合、不要な混乱を避けるという
効果があります。また、マルチスレッドで、クリティカルな制御を
する場合(複数の処理スレッドが同時に実行された時に混乱しない
ようにするための制御)などに使います。

インターフェース
これは分かり難い。事実、技量不足のプログラマに作らせると、
とんでもないバグの原因になったりしますので、使い方も難しい。
例え話:会社の支店を考えましょう。支店には必ず支店長、住所が
あるものとします。しかし、新宿支店には特設会場があり、渋谷支店
には保養所がある。この状態で支店住所を処理するプログラムがある
とすると、支店が新宿なら…、渋谷なら…、○○なら…というように
しなければなりませんね。でも、各支店が支店インターフェースを
持ち、これに支店長と住所があると記載されていれば、プログラムは
「支店の住所」とするだけで良いのです。
同様の使い方をするものに抽象クラスというものがあります。
個人的にはこちらの方が好みです。間違いが少ないし、手続実体を
記述することができます。

継承
機能A、B、Cを持つクラスXがあるとします。仕様が変更になり、
機能Dを追加したとします。直接、Xを修正しても良いのですが、
既存機能A、B、Cが影響を受けていないかどうかを再テストする
必要があります。しかし、Xを継承したクラスYを作り、ここには
機能Dだけを記述します。この場合は機能Dのテストだけで十分と
言えます。(作り方がマズイと継承元の機能に影響することもある)
クラスYはXを継承しているので、機能A、B、Cを持っています。
また、ある共通機能を持つクラスを独立させておくと、これを使う
場合、このクラスをインスタンス化する必要がありますが、この
クラスを継承すると、インスタンス化する必要はなく、自身の
メソッドを呼ぶのと全く同じ感覚で実行することができます。
他にも継承の恩恵は数多くありますが、長くなるので、この辺で
止めます。

と、まぁ文章で語るとこんな具合で、どうしても抽象概念しか分かり
ませんよね。感覚的に「こういうもんだ」と分かるには実経験を
積んで、いろいろな場面に遭遇するしかないでしょうね。
    • good
    • 0
この回答へのお礼

たくさんの方の詳しい回答を、戴きまして
ありがとうございます。

例題プログラムを、
コマンドプロンプトからせっせと
タイプしているレベルなので、
助かります。

コンストラクタもインタフェースも、
何でこんなのワザワザ設定してるんだろ・・・
を、思いながらやってました。

早く悩めるレベル目指して、頑張ります。

お礼日時:2009/09/18 22:32

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