私は現在javaを学んでいて、宿題の指示に答えが見つからないものが見つかりました。次のように攻撃的なゲッター、防御的なセッター
命令はゲッターとセッターメソッドを記述する:
- getPic:PIC(攻撃ゲッタ)
- setPic戻り値:所定のPICのコピーを作成する(防御セッター)
攻撃的ゲッターとd efensiveセッター平均。
誰でもこのことを私に説明できますか?
多くの感謝!
私は現在javaを学んでいて、宿題の指示に答えが見つからないものが見つかりました。次のように攻撃的なゲッター、防御的なセッター
命令はゲッターとセッターメソッドを記述する:
- getPic:PIC(攻撃ゲッタ)
- setPic戻り値:所定のPICのコピーを作成する(防御セッター)
攻撃的ゲッターとd efensiveセッター平均。
誰でもこのことを私に説明できますか?
多くの感謝!
私はこれまでこの用語を見たことがなく、あまり使われていないと思います。
守備ゲッター:その外部コードは影響を与えずに返されたオブジェクトを変更することができるように、代わりにオブジェクト自体の内部オブジェクトのコピーを返します。しかし、私はそれはおそらく次のことを意味だと思うあなたの質問に基づいて、クラスの内部状態:
Foo getFoo() {
return this.foo.clone();
}
攻撃ゲッター:その守備のではない
Foo getFoo() {
return this.foo;
}
ディフェンスセッター:同じ話。元のオブジェクトへの外部変更が内部状態に影響を与えないように、オブジェクトのコピーを作成します。
void setFoo(Foo foo) {
this.foo = foo.clone();
}
攻撃セッター:
void setFoo(Foo foo) {
this.foo = foo;
}
値が不変の場合、区別は無意味です。 – Andreas
この詳しい説明はありがとうございます!私はすでにGoogleの能力を疑うようになりました;) – sleepyhead
私の推測は次のとおりです。 防御という用語は、内部オブジェクトが保護されていることを意味します。防御ゲッターはイメージを返すのではなく、コピーまたは不変のファサードを返します。
攻撃側のセッターは単に画像を上書きします。 もう一度、これは最良の推測です。私は前に言葉を聞いたことがありません。
私は同意する、それらは一般的な名前ではない、私は先生がスマートに聞こえたかったと思う。私はクリストフと同じ方法を推測するだろう。 –
* "攻撃的なセッターは単に画像を上書きします" *。それが区別であれば、画像を更新できない場合、防御的なセッターは何をしますか? ---私の推測*は、イメージがコピーされるかどうか、つまり、セッターが返った後に呼び出し元によって作られたイメージに変更が生じやすいかどうかという違いがある。 – Andreas
はい、防御的なセッターだけでもそれを行うことができます。そうすれば、内部オブジェクトは再び外部から切り離されます。私は決してそれをしなかった。守備ゲッター、はい。特にコレクションについて。 –
これは何と関係がありますかカプセル化はJavaのような言語を意味します。オブジェクト指向言語では、オブジェクトは通常、内部状態を持ちます。
class Picture {
Image picture;
public void Picture(Image img) {
this.picture = img;
}
}
ここでは、画像と呼ばれる画像を含む単純なクラスがあり、コンストラクタによって画像が追加されます。
ここでは、インスタンス化された後にアクセスしたいとしましょう。
私たちは実際のイメージを手渡していますが、これは攻撃的なゲッターになります。誰かが私たちの内部に到達して何かを変えることを可能にする私たちの内部状態への言及を引き渡しています。
防御ゲッターは、最初にコピーを作成して、可能であれば.clone
を使用してオブジェクトの内部状態を変更しないようにします。
public Image getImg() {
Image copy = this.picture.clone();
return copy;
}
セッターはどこですか? –
正直言って、私は以前にこの用語について聞いたことがありませんでした。クイックGoogleチェックでは、「通常の」用語でもないことがわかります。
防御はおそらくMake defensive copies when needed、有効なJavaのアイテム24から来ます。基本的には、ピクチャのコピーをあなたのセッターに渡します。 ピクチャのコピーを作成したので、 "攻撃者"はピクチャを変更することはできません。ピクチャがセッタに渡されました。
攻勢は、あなたが防御していないことを意味しなければなりません(ゲッターの中など)。値を直接返すだけです。あなたはここでも防衛されていて、の写真をにもう一度送り返すことができました。
命令はあなたが何をする必要があるか含まれて守勢ません。 'setPic:指定された写真のコピーを作成します.' - コピーを作成すると、設定者は防御的になります。 'getPic:picを返す ' - (写真のコピーではなく)picを返すとゲッターは攻撃的になります。 – Eran
あなたのソースは何ですか? –
したがって、写真のコピーを返すことでゲッターを守ることもできます。 –