0

Observer パターンの例を調べているときに、次のコードに遭遇しました。4番目の引数は文字列ですが、そこで何が起こるのか疑問に思っていました.インスタンスフィールドlastNameを新しいlastName値に設定してから、これを返しますlastNameか?

この形式の短縮は一般的な方法ですか?

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

1 に答える 1

6

それは効果的にこれを行います:

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し、次に同じ値に設定します (明らかに、呼び出しを繰り返さずに)。

于 2012-12-14T10:16:56.593 に答える