进攻 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 getterdefensive 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;
}