好的,所以我理解为什么我们应该从this question声明一个论点是最终的,但我不明白为什么我们不应该......
由于Java总是使用pass by value,这意味着我们不能通过给定的参数返回一个新值,我们只能覆盖它,并使参数无效,因为我们不使用传递的值。 ..
Java中非最终方法参数的唯一好处是您不必创建参数类型的局部变量吗?
P.S。这个问题是由PMD
的{{1}}
答案 0 :(得分:4)
我只能想到不制作参数final
的两个原因:
如果需要在某些边缘情况下覆盖参数值,则保存局部变量的使用(例如,如果param为null则设置默认值等)。 但是,我不会认为这是一个很好的做法。
每个参数可以保存6个字符,从而提高了可读性。
原因2是导致我不要在大多数时间写它的原因。如果您假设人们遵循从不为参数指定新值的做法,则可以将所有参数视为隐式final
。当然,编译器不会阻止你分配参数,但考虑到可读性的提高,我可以接受它。
答案 1 :(得分:1)
它可以防止您在代码中出现意外错误。这里的经验法则是让你知道的每个字段和每个函数参数不应该改变(我的意思是参考,你仍然可以改变值)在你的代码中作为 final 。
所以基本上它是防止程序员射击脚的意思。没什么。
答案 2 :(得分:1)
您是否要声明局部变量final
(方法参数在此范围内),更多的是要求而不是约定。您没有得到某个答案,说您应该始终使用final
,或者永远不要使用final
。因为这确实是个人偏好。
我个人标记参数或局部变量final
当我真的不想改变它们的值时,它甚至表明我打算让其他开发者不要覆盖这些值。但我不会为每个参数做这件事。对某些人来说,使用final
似乎是噪音,因为这确实增加了代码库。
答案 3 :(得分:0)
Final
无法阻止你更改对象,只能更改它的引用,这是因为java中的对象通常不是不可变的。
看看这段代码:
class Example{
// think about this class as a simple wrapper, a facade or an adapter
SomeClass inner = new SomeClass();
setInnet(Someclass inner){
this.inner = inner;
}
// delegate methods.....
}
现在,在方法中:
private void (final Example examp){
....
examp
将永远是同一个对象,但inner
可能会有所不同...... inner
是这里的重要对象,是制造一切的对象!
这可能是一个极端的例子,您可能认为inner
可能是最终的,但如果它是一个实用工具类,也许它不应该是。此外,很容易找到一个更常见的例子:
public void (final Map map){;
....
//funny things
....
//and then, in a line, someone does:
map.clear()
// no we have the same reference... but the object has change...
....
所以,我在论证中反对final
的观点是,它不能保证final
类中的所有代码都是不可变的,所以final
这个词可以结束说谎你和捣蛋......
通过将final
放在params中,您只能显示愿望,而不是事实,为此您应该使用注释,而不是代码。而且:它在java中是一个标准(事实上),所有参数都只是输入参数(99%的代码)。因此,params中的final
词是NOISE,因为它存在并且没有任何意义。
我不喜欢噪音。所以我尽量避免它。
我只使用final
字来标记将在匿名内部类中使用的内部变量(如果它们实际上是最终的,则可以避免标记它,但它更清晰,更易读)。
<强>已更新强>
最终意味着分配一次&#39;应用于方法参数的方法在程序的逻辑和设计中都没有任何意义。
您可以将参数分配给方法内的新对象,但不会有任何更改。
将final放入参数的唯一区别是,您将无法将该实体分配给其他对象。分配参数可能是丑陋的,也可以避免,但它只是一个风格问题,在这一点上,风格问题应该是分配本身而不是“最终”的用法。字。
我认为决赛在论证中是无用的(因此,噪音),但如果有人能够找到它的使用,我会乐于学习它。我能做些什么才能推出最终的#39;如果不把它放在一边就无法实现?