在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接口方法参数的点?
我有一个抽象类,抽象方法,我想要的参数final- 也就是说,我不想允许抽象类和方法的实现重新分配参数.
编辑:这个动机本身并不是不变性,这更多地与对象的设计有关.(事实上,在我的用例中,参数是将在抽象方法的实现中进行变异的集合.)相反,我想与实现我的抽象类/方法的任何人沟通,不应该重新分配这些变量.我知道我可以通过java-doc进行沟通,但我正在寻找更合同的东西 - 他们必须遵循,而不是仅仅被引导跟随.
在非抽象方法中,我可以使用final关键字来执行此操作- 例如:
public class MyClazz {
public void doSomething(final int finalParameter){
finalParameter++; // compile error - cannot assign a value to final variable
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我final在抽象方法中使用关键字,则这不构成合同的一部分 - 也就是说,抽象方法的实现不需要final关键字,并且可以重新分配参数:
public abstract class MyAbstractClazz {
public abstract void doSomething(final int finalVariable);
}
public class MyExtendedClazz extends MyAbstractClazz {
@Override
public void doSomething(int finalVariable) { // does not require final keyword
finalVariable++; // so the variable is modifiable
}
} …Run Code Online (Sandbox Code Playgroud)