フィールド名を使用すると、カプセル化されません。カプセル化は、クラス間だけでなくクラス内でも適用されます。
将来的にフィールドを再定義するが、アクセサー/セッター関数のシグネチャを同じままにしておくと、クラスを使用する外部クラスが中断しないだけでなく、自分のクラスの内部ルーチンも中断しない。
緩くにApache Wicketのフレームワークに表示コードに基づいて、例えば、このコードを取る(フレームワークは、この問題を受けませんが、私はちょうどそれが示して使用しています):
をのは、これがいたとしましょう元のクラス:ここ
class RadioChoice {
private String prefix;
RadioChoice(String prefix) {
this.prefix = prefix ;
setPrefix(String prefix) {
this.prefix = prefix ;
}
}
我々はすでに問題を見ることができます。同じ操作this.prefix = prefix
は、トウの場所で起こります。これはまったく同じことを意味しますが、2つの場所で発生するため、同じことが2つの異なるものに分岐する可能性があります。
Apache Wicketには、Webページのレンダリング方法の変更を記録するというコンセプトがあり、変更を元に戻すことができます。これは、 "元に戻す"オブジェクトのリストを格納することで行います。 RadioChoiceの接頭辞を元に戻すことができ、そのため「プレフィックス」セッターが変更を記録しなければならないものの一つです:
class RadioChoice {
private String prefix;
RadioChoice(String prefix) {
this.prefix = prefix ;
setPrefix(String prefix) {
// save the old prefix
this.getPage().addChange(new PrefixChange(this.prefix));
// set the new one
this.prefix = prefix ;
}
}
は今、何が起こるか見て:コンストラクタは直接プレフィックスを設定しているため、何の変化がで保存されませんctor。セッターを使用した場合、リファクタリングの後、ctorは自動的に「正しいことをする」でしょう。代わりに、セッターとの両方をリファクタリングする必要があります。もちろん
、我々のコードはまだ最適ではない、現実には、このする必要があります。
setPrefix(String prefix) {
// save the old prefix
this.getPage().addChange(new PrefixChange(this.getPrefix()));
// set the new one
this.prefix = prefix ;
}
}
スコット・マイヤーズ氏は、(C++のことを提唱したこの記事のシリーズを、持っていました、 (プリミティブ関数:はクラスiteslf以外では機能できません)、プリミティブ関数から構成できるすべての関数を自由な関数にすることができます。これは、よりリーンなインターフェース、より安定したインターフェースを可能にする。
同じように、クラス内の関数をプリミティブインターフェイスにのみ依存するように扱える範囲で、柔軟性が増します。特に、それらの機能は、クラスから移動される候補である。より一般的には、setterとgetterを使用すると、変更を防ぐことができます。
はい、それはC#の大きな利点です。 – Randolpho
これらのjavabeanerのものを知らない私たちのもののために何が起きているのですか? –
あなたはそれを自分で正当化できない場合は特に、「誰もがそれらを使用しているように見える」という理由だけで慣習に従うべきではありません。条約は、それが良い考えであることを意味するものではありません。それに質問してください! :) – JoshJordan