[英]Making abstract method parameters final in Java
我有一個帶抽象方法的抽象類,我想要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問題的答案中指出的那樣, final
關鍵字不構成方法簽名的一部分,這就是為什么抽象類的實現不需要它。
所以,有兩個問題:
為什么final
關鍵字不是方法簽名的一部分? 我知道事實並非如此,但我想知道是不是有一個特殊原因。
鑒於final
關鍵字不是方法簽名的一部分,是否有另一種方法使抽象方法中的參數不可分配?
其他研究:
這個問題觸及了同樣的問題,但不是我的兩個問題。 事實上,第二個問題是明確提出的,但沒有得到答案。
關於最終關鍵字的很多問題/博客等都是指“最后的單詞” 。 但是,關於這個問題,相關評論如下(雖然有用,但沒有解決我的兩個問題):
請注意,最終參數不被視為方法簽名的一部分,並且在解析方法調用時被編譯器忽略。 參數可以聲明為final(或不聲明),不會影響方法的覆蓋方式。
我有一個帶抽象方法的抽象類,我想要最終的參數 - 也就是說,我不希望允許抽象類和方法的實現重新分配參數。
為什么不? 這是一個實現細節 。 它對調用代碼是不可觀察的,因此抽象方法沒有理由指定它。 這也就是為什么它不是方法簽名的一部分 - 就像synchronized
不同。
一種方法應該實現其記錄的合同 - 但它如何選擇這樣做取決於它。 合同對參數的最終性沒有任何用處,因為Java總是使用pass-by-value。
參數按值傳遞,如果使用某個變量調用方法,即使重新分配方法中的參數,此變量也不會被修改,這就是為什么最終成為合同的一部分沒有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.