为什么不能将所有函数参数声明为final?

时间:2014-04-25 16:13:38

标签: java oop pmd

好的,所以我理解为什么我们应该从this question声明一个论点是最终的,但我不明白为什么我们不应该......

由于Java总是使用pass by value,这意味着我们不能通过给定的参数返回一个新值,我们只能覆盖它,并使参数无效,因为我们不使用传递的值。 ..

Java中非最终方法参数的唯一好处是您不必创建参数类型的局部变量吗?

P.S。这个问题是由PMD的{​​{1}}

规则触发的

4 个答案:

答案 0 :(得分:4)

我只能想到制作参数final的两个原因:

  1. 如果需要在某些边缘情况下覆盖参数值,则保存局部变量的使用(例如,如果param为null则设置默认值等)。 但是,我不会认为这是一个很好的做法。

  2. 每个参数可以保存6个字符,从而提高了可读性。

  3. 原因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;如果不把它放在一边就无法实现?