簡體   English   中英

在Java中使抽象方法參數最終

[英]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關鍵字不構成方法簽名的一部分,這就是為什么抽象類的實現不需要它。

所以,有兩個問題:

  1. 為什么final關鍵字不是方法簽名的一部分? 我知道事實並非如此,但我想知道是不是有一個特殊原因。

  2. 鑒於final關鍵字不是方法簽名的一部分,是否有另一種方法使抽象方法中的參數不可分配?

其他研究:

  • 這個問題觸及了同樣的問題,但不是我的兩個問題。 事實上,第二個問題是明確提出的,但沒有得到答案。

  • 關於最終關鍵字的很多問題/博客等都是指“最后的單詞” 但是,關於這個問題,相關評論如下(雖然有用,但沒有解決我的兩個問題):

請注意,最終參數不被視為方法簽名的一部分,並且在解析方法調用時被編譯器忽略。 參數可以聲明為final(或不聲明),不會影響方法的覆蓋方式。

我有一個帶抽象方法的抽象類,我想要最終的參數 - 也就是說,我不希望允許抽象類和方法的實現重新分配參數。

為什么不? 這是一個實現細節 它對調用代碼是不可觀察的,因此抽象方法沒有理由指定它。 這也就是為什么它不是方法簽名的一部分 - 就像synchronized不同。

一種方法應該實現其記錄的合同 - 但它如何選擇這樣做取決於它。 合同對參數的最終性沒有任何用處,因為Java總是使用pass-by-value。

參數按值傳遞,如果使用某個變量調用方法,即使重新分配方法中的參數,此變量也不會被修改,這就是為什么最終成為合同的一部分沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM