3

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

例如:

public class Foo {

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

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

4

3 回答 3

15

Java 总是只将参数的副本传递给函数。这意味着 final 对参数所做的唯一事情就是不允许在函数内部分配变量。

分配给函数参数(无论是在构造函数中还是在任何其他函数中)被认为是不好的样式,因为这会将参数的含义从函数参数更改为函数局部变量。名字的意义就这样消失了。

第二个原因是,一个类可能有字段field1,而构造函数有一个名为 的参数field1。声明参数 final 可以避免错误,比如field1 = field1;当一个真正的意思是this.field1 = field1;.

本质上,在函数参数上声明 final 是一种口味问题,并增加了一点安全性(但好的 IDE 应该警告分配无论如何都没有效果)。但是,您将不得不为(可以说是非常少量的)安全性输入更多内容,这就是它不经常使用的原因。

于 2013-08-15T12:59:55.977 回答
3

有时您必须声明它们final

public class Test {
  final Runnable runner;

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

但通常您不必这样做,恕我直言,这只是不必要的干扰。

于 2013-08-15T13:04:36.243 回答
0

您不需要将它们定义为final,但是如果您在内部类中使用它们的参数,则禁止在没有final的情况下传递参数。

在这里检查:

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

于 2013-08-15T12:56:46.437 回答