一尘不染

为什么在Java的方法参数上使用关键字“ final”?

java

当在方法参数上使用final关键字时,我无法理解该关键字在哪里真正方便。

如果我们排除使用匿名类,可读性和意图声明,那么对我来说几乎毫无用处。

强制某些数据保持不变并不像看起来那样强大。

  • 如果参数是原始参数,则它将无效,因为参数作为值传递给方法,并且在范围之外进行更改将无效。
  • 如果我们通过引用传递参数,则引用本身就是一个局部变量,并且如果在方法内部更改了引用,则不会在方法范围之外产生任何影响。

考虑下面的简单测试示例。尽管该方法更改了给定给定值的参考值,但该测试通过了,但没有效果。

public void testNullify() {
    Collection<Integer> c  = new ArrayList<Integer>();      
    nullify(c);
    assertNotNull(c);       
    final Collection<Integer> c1 = c;
    assertTrue(c1.equals(c));
    change(c);
    assertTrue(c1.equals(c));
}

private void change(Collection<Integer> c) {
    c = new ArrayList<Integer>();
}

public void nullify(Collection<?> t) {
    t = null;
}

阅读 621

收藏
2020-03-07

共1个答案

一尘不染

有时,明确(出于可读性)变量不会更改是很好的。这是一个简单的示例,使用final可以节省一些麻烦:

public void setTest(String test) {
    test = test;
}

如果你忘记了设置器上的’this’关键字,那么你想要设置的变量就不会设置。但是,如果你在final参数上使用了关键字,则该错误将在编译时捕获。

2020-03-07