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



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

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

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

这样做很有效:

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

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

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

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

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

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

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

x = y = z = foo();

它调用foo(),将z设置为返回值,然后将y设置为相同值,然后再将x设置为相同的值(显然,不需要重复调用)。

最新更新