我有一个带有抽象方法的抽象类,我想要的参数final
- 也就是说,我不想允许抽象类和方法的实现重新分配参数。
编辑:这样做的动机本身并不是不变性,这更多地与对象的设计有关。(事实上,在我的用例中,参数是集合,它将在抽象方法的实现中发生变化。)相反,我想与任何实现我的抽象类/方法的人沟通,这些变量不应该被重新分配。我知道我可以通过 java-doc 进行沟通,但我一直在寻找更具合同性的东西——他们必须遵循,而不仅仅是被引导遵循。
在非抽象方法中,我可以使用final
关键字来执行此操作 - 例如:
public class MyClazz {
public void doSomething(final int finalParameter){
finalParameter++; // compile error - cannot assign a value to final variable
}
}
但是,如果我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
}
}
正如对这个SO Question的回答所指出的,final
关键字不构成方法签名的一部分,这就是抽象类的实现不需要它的原因。
所以,有两个问题:
为什么
final
关键字不是方法签名的一部分?我知道它不是,但我想知道它是否有特定的原因。鉴于
final
关键字不是方法签名的一部分,是否有另一种方法可以使抽象方法中的参数不可分配?
其他研究:
这个SO question涉及相同的问题,但我的两个问题都没有。事实上,第二个问题是明确提出的,但没有得到答案。
关于final关键字的很多问题/博客等都指的是“final word”。但是,关于这个问题,相关评论如下(虽然有用,但没有解决我的两个问题):
请注意,最终参数不被视为方法签名的一部分,并且在解析方法调用时会被编译器忽略。参数可以声明为 final(或不声明),而不影响方法的覆盖方式。