我的首选方式是:
final boolean result;
final Collection c;
result = test(foo);
if(result)
{
c = cOne;;
}
else
{
c = cOther;;
}
c.add(foo);
首先,我不喜欢拨打电话并且不将值分配给 temp 变量(test(foo) 调用),原因有两个:
- 它更容易调试(System.out.println,甚至调试器 - 如果该方法有副作用,那么只需在调试器中查看它就会再次调用它 - 从而导致副作用)。
- 即使没有副作用,它也会阻止您多次调用它,从而使代码更有效率。编译器/热点应该处理不需要的临时变量的删除。
其次,我不喜欢有代码,如果你模糊你的眼睛,它看起来是一样的。如果你“模糊”你的眼睛,让 cOne.add(foo) 和 cOther.add(foo) “看起来”一样。例如,如果您将其更改为 List 并使用 add(int, E) 而不是 add(E) 那么您只有一个地方可以更改代码,这意味着犯错误的更改更少(例如 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;
}
本质上,如果有意义(通常确实如此),我会为 { } 块内的任何内容创建一个方法。我喜欢有很多小方法。