看起来没有人在这里做过诅咒。
我通常不会改变参数,事实上,我倾向于标记我的参数以明确禁止它。几个原因:final
对参数的赋值可能会与尝试将其用作“输出参数”混淆,ref:javapractices.com,清晰度就是一切
支持不可变性,这适用于参数值,就像其他任何东西一样。基元只是同一事物的退化情况,(通常)更容易推理不可变变量。参考、有效 Java 项目 13 或 javapractices.com
最后(NPI),自由使用最后,javapractices.com。无论它在参数签名中多么丑陋,我相信它倾向于识别意外错误并突出显示可变变量,这通常应该是例外。大多数代码中的大多数可变变量要么是因为懒惰,要么是认为它对性能有一定的影响,因为明智地选择,不可变和命名良好的中间计算更清晰,更易于阅读和验证,并且可以在没有您帮助的情况下针对性能进行干净优化。
我不能抽象地明智地谈论你的具体案例,但除非所有其他事情我可能会做不同的事情,否则我会赞成:
void doStuff(final String origVal)
{
final String valOrDefault = (origVal == null) ? DEFAULT_VALUE : origVal;
//lots of complex processing on valOrDefault
}
甚至(假设你不会在只有一个参数的实际方法中处理空值,它必须是更复杂的东西的一部分)...此外,一般来说,接受作为参数的方法应该被显式记录为这样做,即使只是为了加强空参数应该是例外的假设。在第二种方法中,您甚至可以使用@NonNull
批注。null
/**
* @param origVal string giving value, possibly null, in which case DEFAULT_VALUE is assigned
*/
void doStuff(final String origVal, ... )
{
final String valOrDefault = (origVal == null) ? DEFAULT_VALUE : origVal;
// similar mucking about to make all the parameters behave, separate from
// actually operating on them...
...
reallyDoStuff(valOrDefault,...);
}
private void reallyDoStuff(final String value, ...)
{
assert (value != null);
// do your complex processing
}
StackOverflow上的相关问题(和相关参数):“在Java中适用时使用最终修饰符......”,“方法参数中的最终关键字”,“您是否在Java中最终确定局部变量和方法参数”。