我不明白其中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;
}
Run Code Online (Sandbox Code Playgroud) 在Java中,final在接口方法中定义参数并且不遵循实现类中的参数是完全合法的,例如:
public interface Foo {
public void foo(int bar, final int baz);
}
public class FooImpl implements Foo {
@Override
public void foo(final int bar, int baz) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,bar并且在类VS的接口中baz有相反的final定义.
以同样的方式,final当一个类方法扩展另一个类时,不会强制执行任何限制abstract.
虽然final在类方法体内有一些实用价值,但是有没有指定final接口方法参数的点?