私の好みの方法は次のとおりです。
final boolean result;
final Collection c;
result = test(foo);
if(result)
{
c = cOne;;
}
else
{
c = cOther;;
}
c.add(foo);
まず、次の 2 つの理由から、呼び出しを行って一時変数に値を割り当てない (test(foo) 呼び出し) ことは好きではありません。
- デバッグが簡単です(System.out.println、またはデバッガーでさえ-メソッドに副作用がある場合、デバッガーでそれを見るだけで再度呼び出されるため、副作用が発生します)。
- 副作用がなくても、コードをより効率的にするために複数回呼び出すことを思いとどまらせます。コンパイラ/ホットスポットは、不要な一時変数の削除に対処する必要があります。
第二に、目をぼかすと同じように見えるコードが好きではありません。cOne.add(foo) と cOther.add(foo) を同じように「見える」ようにすると、目を「ぼかす」ことができます。たとえば、リストに変更し、add(E) の代わりに add(int, E) を使用している場合、コードを変更する場所は 1 か所しかないため、間違いを犯す変更が少なくなります (cOne.add など)。 (1, foo) と cOther.add(2, foo) の両方を add(1, foo)) にする必要があります。
編集(コメントに基づく)
いくつかの選択肢がありますが、コードのレイアウト方法によって異なります。私はおそらく次のようなものに行きます:
private Collection<Whatever> chooseCollection(final Whatever foo,
final Collection<Whatever> a,
final Collection<Whatever> b)
{
final boolean result;
final Collection<Whatever> c;
result = test(foo);
// could use a conditional - I just hate using them
if(result)
{
c = a;
}
else
{
c = b;
}
return (c);
}
そして、次のようなものがあります:
for(......)
{
final Collection<Whatever> c;
final Whatever foo;
foo = ...;
c = chooseCollection(foo, cOne, cOther);
c.add(foo;
}
基本的に、私は { } ブロック内の何かに対して、それが理にかなっている場合 (そして通常はそうです) のメソッドを作成します。小さなメソッドがたくさんあるのが好きです。