2

2学期前、私には次のような教授がいました。

一部のユーザーは、すべてのプライベート インスタンス変数に対して常にセッター メソッドとゲッター メソッドを含めるように言われています。これは情報の隠蔽を破り、多くの場合、不変条件を強制できないシステムになると私は言います。

今、それは私には正しいように聞こえます。しかし、これらの種類のセッター/ゲッターを含めることは、JavaBeans を作成するためのコア部分ではありませんか? もしそうなら、なぜですか?そうでない場合、JavaBeans について何を誤解していますか?

4

4 に答える 4

1

あなたの教授は正しいです。すべてのインスタンス変数に対して盲目的にゲッターとセッターを作成する必要はありません。必要な場所に作成します。

インスタンス変数を持つBankAccountクラスがあるbalance場合、バランスをチェックして設定できるようにする場合は、そのクラスのゲッターとセッターを作成するのが理にかなっています。

ここでも、実装をカプセル化するという形で情報が隠されています。ゲッター" double getBalance()"は、基になるインスタンス変数の値を返す場合があります。または、変数の実装の選択肢でdoubleある場合は、から派生した値を返す場合があります。または、リモートWebサービスを呼び出してBigDecimal結果。したがって、getter / setterは実装を変更できるため、カプセル化に違反しません(さらに、JavaBeansにも違反しません)。

JavaBeansが行うことはgetXXX(), setXXX()、ユーザーが通常調べたり変更したりするクラスの属性である「プロパティ」を取得および設定するためのインターフェース()を定義することです。クラスに「プロパティ」と見なされない情報がある場合、それを公開する必要はありません。たとえば、BankAccountクラスに引き出しの検証に使用されるインスタンス変数があるとします。クライアントがこれにアクセスしたり変更したりする必要がない場合は、ゲッターまたはセッターを作成しても意味がありません。

于 2009-09-09T18:00:19.120 に答える
1

なぜ getter メソッドと setter メソッドが悪いのかを読みたいと思うかもしれません:

「しかし、JavaBeans はどうですか?」と反論するかもしれません。彼らをどう思いますか?getter と setter がなくても JavaBeans を構築できます。、 BeanCustomizerBeanInfoおよび BeanDescriptorクラスはすべて、まさにこの目的のために存在します。JavaBean 仕様の設計者は、getter/setter のイディオムを絵に取り入れました。これは、Bean をすばやく作成する簡単な方法であり、正しく行う方法を学んでいる間にできることだと考えたからです。残念ながら、誰もそれをしませんでした。

アクセサーは、特定のプロパティにタグを付けて、UI ビルダー プログラムまたは同等のプログラムがそれらを識別できるようにするためだけに作成されました。これらのメソッドを自分で呼び出すことは想定されていません。それらは、自動化されたツールが使用するために存在します。このツールは、Classクラス内のイントロスペクション API を使用してメソッドを検索し、メソッド名から特定のプロパティの存在を推定します。実際には、この内省に基づくイディオムはうまくいきませんでした。コードが非常に複雑で手続き的になりすぎています。データの抽象化を理解していないプログラマーは、実際にアクセサーを呼び出します。その結果、コードの保守性が低下します。

于 2009-09-09T20:35:07.293 に答える
1

Java Bean クラスでは、ゲッターとセッターは必要ありません。必要なのは、クラスがパブリックである必要があり、引数のないパブリック コンストラクターが必要であり、Serializable を実装する必要があることだけです。ただし、Bean の使用時に変数が自動的に検出されるようにするには、標準の命名規則 (getVarname、setVarname...) に従ってゲッターとセッターを提供する必要があります。

いずれにせよ、クラスの外でビジネスが見られる変数だけを外部から見えるようにしたいでしょう。

于 2009-09-09T18:01:14.220 に答える
0

通常は非常に単純で、外部に表示する必要のある変数のセッター/ゲッターを公開します。また、他の誰も知らない変数のセッター/ゲッターを公開しません。

于 2009-09-09T17:55:33.357 に答える