簡體   English   中英

關於“二進制兼容性”的問題

[英]Issue about “binary compatibility”

當我閱讀Java語言規范(JLS8)> 二進制兼容性時 ,不會破壞二進制兼容性的一組更改之一是:

更改方法或構造函數以返回其先前曾拋出異常的輸入的值,這些異常通常不應該發生或因進入無限循環或導致死鎖而失敗

我不明白這個主意。

請幫助澄清並舉例說明。

不是很確定,但是我可以從中推斷出這一點。
假設您有一些方法可以接受某個整數並返回一個整數。

int myMethod(int arg);

現在JLS講的是

這是Java編程語言支持的一些重要的二進制兼容更改的列表:

.....
更改方法或構造函數以在其先前拋出異常的輸入上返回值,這些異常通常不應該發生或因進入無限循環或導致死鎖而失敗。

假設有一些無效的輸入(例如您的方法僅設計用於正整數,並且您通過了其他操作),該方法要么拋出某些異常(作為驗證的一部分,否則)將結果輸入一些未定義的行為中,例如無限循環等

因此,對於這些類型的輸入(無效輸入),如果您想返回一個指示相同值的值,那么它不會破壞二進制兼容性,這是JLS所說的。 例如。 您想返回-1或類似的值來指示過時參數的傳遞(而不是拋出或具有未定義的行為)。 它是特定於實現的,並且取決於您如何處理此類輸入。

更改方法或構造函數以在其之前拋出通常不應該發生的異常的輸入上返回值

現有代碼:

public int square(int x) {
    if (x % 2 == 0) {
        return x * x;
    } else {
        throw new IllegalArgumentException("Cannot square odd numbers");
    }
}

滿足上述規則的兼容更改的示例:

public int square(int x) {
    return x * x;
}

不兼容更改的示例:

public int square(int x) {
    if (x % 2 == 1) {
        return x * x;
    } else {
        throw new IllegalArgumentException("Cannot square even numbers");
    }
}

或因陷入無限循環或導致死鎖而失敗

之前:

public int square(int x) {
    if (x % 2 == 0) {
        return x * x;
    } else {
        while (true)
            ;
    }
}

滿足上述規則的兼容更改的示例:

public int square(int x) {
    if (x % 2 == 0) {
        return x * x;
    } else {
        // Even this is binary compatible (although bad form as the method
        // name is no longer self-explanatory.)
        return x * x * x;
    }
}

我想你明白了。

這些語句的實際含義是:

  • 您可以添加使您的方法成功完成之前無法完成的功能
  • 但是,在保持二進制兼容的同時,您不能更改已經有效的輸入的現有行為。

這是一種表達很多常識的奇特方式。

暫無
暫無

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

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