Java インターフェイスの使用ガイドライン — インターフェイス内のゲッターとセッターは悪いものですか?

StackOverflow https://stackoverflow.com/questions/1130294

質問

インターフェイスで使用する最適なガイドラインについて人々はどう考えているでしょうか?インターフェースに何を入れるべきで、何を入れてはいけないのでしょうか?

一般的なルールとして、インターフェイスでは状態ではなく動作のみを定義する必要がある、という話を聞いたことがあります。これはインターフェースという意味ですか? ゲッターとセッターを含めるべきではないでしょうか?

私の意見:セッターの場合はそうではないかもしれませんが、ゲッターをインターフェイスに配置するのは有効ではないかと思うことがあります。これは、単に実装クラスにこれらのゲッターを実装するよう強制し、クライアントがそれらのゲッターを呼び出して、たとえば何かをチェックできることを示すためのものです。

役に立ちましたか?

解決

があると思う二種類のインターフェースで宣言された一般

  1. a サービスの内容について.このようなもの CalculationService.いとは思わない方法 getX あるべきこのようなインターフェイス、および 確かに ない setX.彼らは明らかにな実装の詳細な仕事をこの型のインタフェース。
  2. a データモデル -が存在するのみを抽出しの実施のデータオブジェクトのシステム。これらのトランでもご利用いただい援助の実験やがて古いが立ち上げられるということで、覚えている日時(例えば)を使用し続枠組みをつくるために、特定のsuperclasss(まだ実現しようとするインターフェースの場合に切り替えをお持続性についてると思いるJavaBeanの方法は、この型のインタフェースは完全にリーズナブル。

注意:コレクションに教え合わせるタイプ#2

他のヒント

インターフェイスでゲッターとセッターを定義できない理由がわかりません。例えば、 List.size() 実質的にゲッターです。インターフェイスは、動作ではなく動作を定義する必要があります。 実装 ただし、どうなるかはわかりません ハンドル 状態ですが、それを取得して設定できると主張することもできます。

たとえば、コレクション インターフェイスはすべて状態に関するものですが、コレクションが異なれば、その状態は根本的に異なる方法で保存されます。

編集:コメントは、ゲッターとセッターが単純なフィールドがバッキング ストレージに使用されることを暗示していることを示唆しています。私はこの意味に激しく同意します。私の考えでは、値の取得/設定が「かなり安価」であるという意味はありますが、それが簡単な実装でフィールドとして保存されるということではありません。


編集:コメントで指摘されているように、これは JavaBeansの仕様 セクション 7.1:

したがって、スクリプトライターが次のようなものを入力した場合でも b.Label = fooターゲットオブジェクトにはプロパティを設定するメソッドコールがまだあり、ターゲットオブジェクトには完全なプログラム制御があります。

したがって、プロパティは単純なデータフィールドだけではなく、実際に計算された値である必要があります。更新には、さまざまなプログラム的な副作用がある場合があります。たとえば、Beanの背景色のプロパティを変更すると、Beanが新しい色で塗り直される可能性があります。」


もし想定される意味合いが だった 確かに、プロパティをフィールドとして直接公開してもよいでしょう。幸いにもその意味は しません 所有:ゲッターとセッターは、計算する権利を完全に保持しています。

たとえば、次のコンポーネントがあるとします。

getWidth()
getHeight()
getSize()

そこには 3 つの変数があるという意味があると思いますか?次のいずれかを行うのは合理的ではないでしょうか。

private int width;
private int height;

public int getWidth() {
    return width;
}

public int getHeight() {
    return height;
}

public Size getSize() {
    return new Size(width, height); // Assuming an immutable Size type
}

または (できれば IMO):

private Size size;

public int getWidth() {
    return size.getWidth();
}

public int getHeight() {
    return size.getHeight();
}

public Size getSize() {
    return size;
}

ここで、size プロパティまたは高さ/幅プロパティは便宜上の目的でのみ使用されますが、それがそれらを無効にするものではありません。

にある本質的に悪いsetterか/セッター.しかし:

  1. してしまいがちな自分を変更不能なオブジェ(最初のインスタンス)に関しての分野が含まれている.なぜですか?たインスタンスを生成に殆どの建設段階となって行きます。したい場合は変更に何かしたら駅よりタクシーで約者ます。私の界面の傾向がありますが含setterかな仕掛け人である(その他の特典-特にネジ).
  2. の気持ちを抱いて欲しいと思い物にいっ, いう。だから私物を取得しのsetterかっ開始いるかどうかそのオブジェクトの持つべき機能でより露そのすべてのデータが何かをするのに用いられております。見 この答え 詳します。

これらはすべてのガイドラインです。

私は、Beanが一般的で、その上にインタフェースを持たなければならないとは思いません。 JavaBeanは、より一般的な意味でのインタフェースです。インターフェイスは、より複雑な何かの外部の契約を指定します。 JavaBeanの対外契約とその内部表現は同じです。

私はしかし、あなたがインターフェイスにゲッターを持つべきではないとは言えないでしょう。それはDataThingieBeanによって実装されているReadableDataThingieインターフェイスを持つように完璧な理にかなっています。

  

私が聞いた人々が通り、と言います   一般的なルールは、インターフェースのみが必要   行動とない状態を定義します。い   これは、インターフェイスがないことを意味します   ゲッターとセッターが含まれている?

手始めに、少なくともJavaおよび除く例外の宣言で、あなたは状態なしで、完全な動作を定義することはできません。 Javaでは、インターフェイスは動作を定義していません。彼らはできません。彼らは何を定義することはタイプです。おそらくいくつかの事後条件のWRTの例外を除いて、機能シグネチャのセットを実装する約束。しかし、それはそれです。動作状態は、これらのインターフェースを実装するクラスによって定義されます。

ゲッターとセッターがインターフェイスで定義されている場合は、

第二に、彼らは本当に完全な動作を定義していない(1が読み取りおよび1のためのものであること、他の書き込みWRTプロパティのためです。)あなたは、セッターとゲッターの後ろに複雑な挙動を持つことができ、しかし、彼らは、実際のクラスで実装することができます。私たちは自由に例最も制限以外のインターフェイスで動作を定義できるようにすることができますJava言語では何もありません。

を考慮していると、何も問題がない - 構文的および意味的 - インターフェイスにセッターとゲッターを有する

あなたのアプリケーションはよくモデル化され、問題はなぜ、あなたはセッターとゲッターを定義するインタフェースを持っていることを必要とする場合。たとえば、たServletResponseインタフェースを見てみましょう。

私たちは、JavaBeansの仕様に準拠したクラスを実装の観点から、ゲッターとセッターを見れば、

さて、あなたは彼らのためのインタフェースを定義する必要はありません。

しかし、あなたは、そしてそのため、複数の実装が存在する可能性がある(かもしれない豆のような実行時に)豆のような可能性があり、また、コンパイル型でプラグインすることが必要とされ、セッターとゲッターを必要とするものを持っている場合、次にええ、これはゲッターとセッターを定義するインターフェイスを求めるだろう。

それがお役に立てば幸いです。

これは、全体のゲッター/セッター時に触れた他の場所で、このサイトとで複数回アドレスされる邪悪な話題です。

私は、インターフェイスにアクセサを持っていない好む傾向があるが、実装にコンストラクタ引数を使用して協力者を追加します。

それがために必要がある場合は、

何かの簡単な実装はゲッターとしてであるという事実は、インターフェイスにいることを止めるべきではありません。

さらに読み取りの場合:Javaのフレームワークのアーキテクトの実用的なAPI設計告白(ヤロスラフTulach、2008年、プレスカンファレンス)

例えば、我々はフィールドBEGINDATE、endDateに持つクラスを持っていた

私は、インターフェイスのこれらの種類を使用しました。これらのフィールドは、多くのクラスにいたと私は別のオブジェクトのためにこれらの日付を取得する必要がある1つのユースケースを持っていたので、私はインターフェイスを抽出し、とても幸せでした:)

基本的に答えは「私はそれのインスタンスを使用するために[whateverThignAMaGit、プロパティを状態]の値を知っておく必要がありますか?」場合[はい...アクセサは、インタフェースに属します。

ジョンからはlist.size()は、上記インタフェースで定義される必要があるゲッターの完璧な例である

あなたのインターフェースを設計するとき、あなたが本当に回避することができます -

ゲッターはオブジェクトの状態を照会するために使用されています。 http://www.pragprog.com/articles/tell-dont-ask

scroll top