我有一个抽象类和一个抽象方法,我想让它们的参数是final的,也就是说,我不想允许实现抽象类和方法的重新给参数赋值。
编辑:这个动机并不是为了本身的不变性,而更多地与对象设计有关。 (实际上,在我的用例中,参数是一个集合,在实现抽象方法时将被改变。)相反,我希望向任何实现我的抽象类/方法的人传达这些变量不应该被重新分配的信息。 我知道我可以通过Java-doc来传达这一点,但我正在寻找更具约束力的东西-他们必须遵循的规则,而不仅仅是指导遵循。在非抽象方法中,我可以使用final关键字来实现这一点-例如:
然而,如果我在抽象方法中使用
正如在回答这个SO问题中指出的那样,
所以,有两个问题:
编辑:这个动机并不是为了本身的不变性,而更多地与对象设计有关。 (实际上,在我的用例中,参数是一个集合,在实现抽象方法时将被改变。)相反,我希望向任何实现我的抽象类/方法的人传达这些变量不应该被重新分配的信息。 我知道我可以通过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问题中指出的那样,
final
关键字并不是方法签名的一部分,这就是为什么抽象类的实现不需要它的原因。所以,有两个问题:
为什么
final
关键字不是方法签名的一部分?我知道它不是,但是我想知道是否有特殊的原因。既然
final
关键字不是方法签名的一部分,是否有其他方法可以使抽象方法中的参数不可分配?
这个SO问题涉及到了同样的问题,但没有回答我的两个问题。事实上,第二个问题被明确提出,但没有得到回答。
许多与
final
关键字相关的问题/博客等都提到了“the final word”。然而,关于这个问题,相关的评论如下(虽然有用,但没有回答我的两个问题):
请注意,final参数不被视为方法签名的一部分,并且在解析方法调用时被编译器忽略。参数可以声明为final(或非final),而不会影响如何重写该方法。