JavaBeansの設計は、情報隠蔽とどのように関係していますか?
-
05-07-2019 - |
質問
2学期前、教授に次のように言われました:
一部のユーザーは、すべてのプライベートインスタンス変数に対して常にsetterおよびgetterメソッドを含めるように言われています。これは情報の隠蔽を破り、不変条件を強制できないシステムになることが多いと言います。
今、それは私に聞こえます。しかし、これらの種類のセッター/ゲッターを含めることは、JavaBeansの作成の中核部分ではありませんか?もしそうなら、なぜですか?そうでない場合、JavaBeansについて誤解していることは何ですか?
解決
ゲッターとセッターは、Java Beanクラスでは必要ありません。必要なのは、クラスがパブリックでなければならず、パブリックの引数なしコンストラクタが必要であり、Serializableを実装する必要があることだけです。ただし、Beanの使用時に変数が自動的に検出されるようにするには、標準の命名規則(getVarname、setVarname ...)に従ってゲッターとセッターを提供する必要があります。
いずれの場合でも、クラスの外でビジネスが見られる変数のみを外部から見えるようにしたい。
他のヒント
"しかし何を言って反対するかもしれません JavaBeansについて?"彼らをどう思いますか?君は 確かになしでJavaBeansを構築することができます ゲッターとセッター。の
BeanCustomizer
、BeanInfo
、およびBeanDescriptor
クラスはすべて存在します まさにこの目的。 JavaBean 仕様設計者はゲッター/セッターを投げました 写真のイディオム それは簡単な方法だと思った Beanをすばやく作成します。 あなたがそれを行う方法を学んでいる間に行う 右。残念ながら、誰もそれをしませんでした。アクセサは方法としてのみ作成されました 特定のプロパティにタグを付けるために UIビルダープログラムまたは同等のもの それらを識別します。あなたはするべきではない これらのメソッドを自分で呼び出します。彼ら 自動化ツールを使用するために存在します。 このツールはイントロスペクションAPIを使用します
Class
クラスでメソッドを見つけます の存在を推定する メソッドの特定のプロパティ 名前。実際には、これ イントロスペクションベースのイディオムはそうではありません うまくいった。コードを大幅に作成しました 複雑すぎて手続き的です。 データを理解していないプログラマー 抽象化は実際に呼び出します アクセサー、そしてその結果、 コードのメンテナンス性が低下します。
通常は非常に単純で、外部から見えるようにする必要がある変数のセッター/ゲッターを公開し、他の誰も知らない変数のセッター/ゲッターを公開しません。
あなたの教授は正しいです。すべてのインスタンス変数に対して盲目的にゲッターとセッターを作成する必要はありません。必要な場所にそれらを作成します。
balance
インスタンス変数を持つ BankAccount
クラスがある場合、残高を確認および設定できるようにするには、そのためのgetterおよびsetterを作成するのが理にかなっています。
ここでも、実装をカプセル化する形で情報が隠されています。ゲッター" double getBalance()
" double
である場合、基になるインスタンス変数の値を単に返すことができます。または、変数の実装選択である場合、 BigDecimal
から派生した値を返すことができますまたは、リモートWebサービスを呼び出して結果を返すこともできます。そのため、ゲッター/セッターは実装の変更を許可するため、カプセル化に違反しません(ひいてはJavaBeansにも違反しません)。
JavaBeansが行うことは、ユーザーが通常検査または変更したいクラスの属性である「プロパティー」を取得および設定するためのインターフェース( getXXX()、setXXX()
)を定義することです。クラスに「プロパティ」と見なされない情報がある場合、それを公開する必要はありません。たとえば、 BankAccount
クラスに引き出しの検証に使用されるインスタンス変数があるとします。クライアントがこれにアクセスしたり変更したりする必要がない場合、そのゲッターまたはセッターを作成しても意味がありません。