进攻性的得主,防守二传手

时间:2016-12-11 09:39:36

标签: java getter-setter

我目前正在学习java,并在我的作业说明中找不到答案。

该指令描述了getter和setter方法如下:

  
      
  • getPic:返回pic(攻击性吸气剂)
  •   
  • setPic:创建给定图片的副本(防御设置者)
  •   

我找不到攻击性吸气器防守二传手意味着什么的答案。

有人能解释一下吗?

非常感谢!

4 个答案:

答案 0 :(得分:4)

我以前从未见过这个术语,我认为它用得不多。但根据你的问题,我认为这可能意味着以下几点:

防御性getter :返回内部对象副本而不是对象本身的内容,以便外部代码可以更改返回的对象而不影响类的内部状态:

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;
}

答案 1 :(得分:3)

我的猜测如下: 防御一词意味着内部对象受到保护。因此,防御性的吸气剂不会返回图像,而是复制或不可变的外观 反过来,攻击性的设定者只会覆盖图像。 但同样,这是一个最好的猜测。我之前从未听过这些条款。

答案 2 :(得分:2)

说实话,我之前从未听说过这个术语。快速谷歌检查表明它不是常见的"术语要么。

防御性可能来自有效Java的第24项Make defensive copies when needed。基本上你会(通过任何方式)制作传递给你的setter的 pic 的副本。由于您已制作了 pic 的副本,因此"攻击者"不能通过修改传递给setter的 pic 来改变你实例中的 pic

攻击然后必须意味着你不进行辩护(例如在getter中),你只需要直接返回值。你也可以在这里防守,再次返回 pic 的副本。

答案 3 :(得分:0)

这与 encapsulation 对Java等语言的意义有很大关系。在面向对象的语言中,我们的对象通常具有内部状态。

class Picture {
   Image picture;

   public void Picture(Image img) {
       this.picture = img;
   }
}

这里我们有一个简单的类,它包含一个名为picture的图像,构造函数将图像添加到它。

现在让我们说我们希望在实例化之后访问它。我们可以简单地使用类似的方法:

public Image getImg() {
   return this.picture;
}

但我们正在分发我们的实际形象,这将是一个冒犯性的吸气剂。我们正在发布对我们内部状态的引用,让其他人进入我们内部并改变一些事情。

防御性getter会阻止通过首先制作副本来改变对象的内部状态,可能使用.clone

public Image getImg() {
   Image copy = this.picture.clone();
   return copy;
}