我在查找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
设置为相同的值(显然,不需要重复调用)。