在方法参数内设置实例字段值

时间:2012-12-14 10:14:02

标签: java observer-pattern

我在查找Observer模式的示例时遇到了以下代码。第四个参数是一个String,但我想知道那里发生了什么:它是否将实例字段lastName设置为新的lastName值,然后返回此lastName

这种形式的缩短是常见做法吗?

 public void setLastName(String lastName) {
  notifyListeners(this, "lastName", lastName, this.lastName = lastName);
}

1 个答案:

答案 0 :(得分:6)

这实际上是这样的:

public void setLastName(String lastName) {
  this.lastName = lastName;
  notifyListeners(this, "lastName", lastName, lastName);
}

例如,首先将实例成员lastName设置为参数lastName,然后在调用函数时再次使用该值。

我不会说这是常见的,尽管有一些使用它的习语(见下文);在这种特定情况下,没有特别好的理由这样做。我们的想法是,“get from variable”操作只需要发生lastName一次,然后将该值分配给this.lastName并传递给函数。但是编译器和JVM不仅可以确保清晰的代码(在合理范围内)是有效的,而且它们无法帮助人们理解令人困惑的代码。 : - )

正如jlordo在评论中指出的那样,有一些习惯用法,这种分配和使用很常见,例如:

while ((line = in.readLine()) != null) {
    // ...
}

调用函数时更为罕见,但在这种循环中很常见。

你也可以在复合赋值中看到它,例如:

x = y = z = foo();

...调用foo(),将z设置为返回值,然后将y设置为相同的值,然后将x设置为相同的值(不,显然,重复这个电话。)