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

时间:2013-08-15 12:51:49

标签: java constructor final

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

例如:

public class Foo {

   public Foo(final int day, final int month, final int year) {
    ...
   }
}

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

3 个答案:

答案 0 :(得分:12)

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

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

第二个原因是类可以使字段field1和构造函数具有名为field1的参数。声明参数final会避免出现field1 = field1;这样的错误,而实际意味着this.field1 = field1;

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

答案 1 :(得分:2)

有时您必须声明final

public class Test {
  final Runnable runner;

  public Test(final String text) {
    runner = new Runnable () {
      @Override
      public void run () {
        System.out.println("Run: "+text);
      }
    };
  }
}

但通常你没有和恕我直言,这只是一个不必要的分心。

答案 2 :(得分:0)

你不需要将它们定义为final,但是如果你在内部类中使用它们,则禁止传递参数而不使用final。

点击此处:

http://littletutorials.com/2008/03/08/local-inner-classes/