进攻 getter,防守 setter
offensive getter, defensive setter
我目前正在学习 java 并在作业说明中找到了一些我无法找到答案的内容。
指令描述getter和setter方法如下:
- getPic: returns the pic (offensive getter)
- setPic: creates a copy of the given pic (defensive setter)
我找不到 offensive getter 和 defensive setter 的答案。
谁能给我解释一下吗?
非常感谢!
我的猜测如下:
防御性一词意味着内部对象受到保护。因此,防御性 getter 不会 return 图像,而是复制或不可变的外观。
反过来,攻击 setter 只会覆盖图像。
但同样,这是最好的猜测。我以前从未听说过这些条款。
这更多地与 封装 对于像 Java 这样的语言意味着什么有关。在面向对象的语言中,我们的对象通常有一个内部状态。
class Picture {
Image picture;
public void Picture(Image img) {
this.picture = img;
}
}
这里我们有一个简单的 class,其中包含一个名为 picture 的图像,构造函数将图像添加到其中。
现在假设我们想要在实例化后访问它。我们可以简单地使用如下方法:
public Image getImg() {
return this.picture;
}
但我们正在分发我们的实际图像,这将是一种冒犯 getter。我们正在分发对我们内部状态的引用,让其他人进入我们的内部并改变某些东西。
防御性 getter 会通过首先制作副本来防止更改对象的内部状态,可能使用 .clone
.
public Image getImg() {
Image copy = this.picture.clone();
return copy;
}
老实说,我以前从未听说过这个术语。快速 Google 检查表明它也不是 "usual" 术语。
Defensive 可能来自 Make defensive copies when needed,第 24 条来自 Effective Java。基本上,您将制作(通过任何方式)传递给您的 setter 的 pic 的副本。由于您已经复制了 pic,因此 "attacker" 无法再通过修改来更改实例中的 pic传递给 setter.
的 pic
Offensive那么一定意味着你不防守(比如getter),你直接return这个值。你也可以在这里采取防御措施,再次 return 复制 pic。
我以前从未见过这个术语,我认为它使用的不多。但根据你的问题,我认为这可能意味着以下内容:
Defensive getter: 即 returns 一个内部对象的副本,而不是对象本身,这样外部代码可以改变返回的不影响 class:
的内部状态的对象
Foo getFoo() {
return this.foo.clone();
}
进攻性getter:非防守性
Foo getFoo() {
return this.foo;
}
防守setter:同样的故事。创建对象的副本,以便对原始对象的外部更改不会影响内部状态。
void setFoo(Foo foo) {
this.foo = foo.clone();
}
进攻型setter:不防守
void setFoo(Foo foo) {
this.foo = foo;
}
我目前正在学习 java 并在作业说明中找到了一些我无法找到答案的内容。
指令描述getter和setter方法如下:
- getPic: returns the pic (offensive getter)
- setPic: creates a copy of the given pic (defensive setter)
我找不到 offensive getter 和 defensive setter 的答案。
谁能给我解释一下吗?
非常感谢!
我的猜测如下:
防御性一词意味着内部对象受到保护。因此,防御性 getter 不会 return 图像,而是复制或不可变的外观。
反过来,攻击 setter 只会覆盖图像。
但同样,这是最好的猜测。我以前从未听说过这些条款。
这更多地与 封装 对于像 Java 这样的语言意味着什么有关。在面向对象的语言中,我们的对象通常有一个内部状态。
class Picture {
Image picture;
public void Picture(Image img) {
this.picture = img;
}
}
这里我们有一个简单的 class,其中包含一个名为 picture 的图像,构造函数将图像添加到其中。
现在假设我们想要在实例化后访问它。我们可以简单地使用如下方法:
public Image getImg() {
return this.picture;
}
但我们正在分发我们的实际图像,这将是一种冒犯 getter。我们正在分发对我们内部状态的引用,让其他人进入我们的内部并改变某些东西。
防御性 getter 会通过首先制作副本来防止更改对象的内部状态,可能使用 .clone
.
public Image getImg() {
Image copy = this.picture.clone();
return copy;
}
老实说,我以前从未听说过这个术语。快速 Google 检查表明它也不是 "usual" 术语。
Defensive 可能来自 Make defensive copies when needed,第 24 条来自 Effective Java。基本上,您将制作(通过任何方式)传递给您的 setter 的 pic 的副本。由于您已经复制了 pic,因此 "attacker" 无法再通过修改来更改实例中的 pic传递给 setter.
的 picOffensive那么一定意味着你不防守(比如getter),你直接return这个值。你也可以在这里采取防御措施,再次 return 复制 pic。
我以前从未见过这个术语,我认为它使用的不多。但根据你的问题,我认为这可能意味着以下内容:
Defensive getter: 即 returns 一个内部对象的副本,而不是对象本身,这样外部代码可以改变返回的不影响 class:
的内部状态的对象Foo getFoo() {
return this.foo.clone();
}
进攻性getter:非防守性
Foo getFoo() {
return this.foo;
}
防守setter:同样的故事。创建对象的副本,以便对原始对象的外部更改不会影响内部状态。
void setFoo(Foo foo) {
this.foo = foo.clone();
}
进攻型setter:不防守
void setFoo(Foo foo) {
this.foo = foo;
}