构造函数参数应该声明为final

Jav*_*per 3 java constructor final

我已经看到函数参数已被声明为final的代码.令人惊讶的是没有看到构造函数参数声明为final的代码.

例如:

public class Foo {

   public Foo(final int day, final int month, final int year) {
    ...
   }
}
Run Code Online (Sandbox Code Playgroud)

为什么这不常见?有没有具体的原因或只是代码变得冗长的事实?

Tim*_*ann 12

Java始终只将参数的副本传递给函数.这意味着参数最终的唯一作用是禁止在函数内部赋值.

分配给函数参数(无论它是在构造函数中还是任何其他函数中)都被认为是错误的样式,因为这会将参数的含义从函数参数更改为函数局部变量.因此,名称的含义就丢失了.

第二个原因是类可能使字段field1和构造函数具有名为的参数field1.声明参数final可以避免出现错误,例如field1 = field1;实际意义上的错误this.field1 = field1;.

从本质上讲,在函数参数上声明final是一个品味问题,并增加了一些安全性(但是好的IDE应该警告无论如何都没有任何影响).你必须为此安排更多(可能是非常少量的)安全性,这就是为什么它不经常使用.