关于"二进制兼容性"的问题

时间:2017-08-29 04:02:32

标签: java compatibility binary-compatibility

当我阅读Java语言规范(JLS8)时> Binary Compatibility,其中一项不会破坏二进制兼容性的更改是:

  

更改方法或构造函数以返回它们的输入值   以前要么抛出通常不应该发生或者失败的异常   进入无限循环或导致死锁

我不明白这个想法。

请帮助澄清并举例说明。

2 个答案:

答案 0 :(得分:0)

不太确定,但我可以从中推断出这一点。
假设您有一些接受某个整数的方法,并返回一些整数。

int myMethod(int arg);

现在JLS所说的是

  

这里列出了Java编程语言支持的一些重要的二进制兼容更改:

     

.....
  更改方法或构造函数以返回输入值,这些输入值先前通过进入无限循环或导致死锁而抛出通常不应发生或失败的异常。

假设某些无效输入(就像你的方法只设计用于正整数并且你传递的除此之外),该方法会抛出一些异常(作为验证的一部分或其他)或者将结果输入某些未定义的行为,如无限循环等。

因此,对于这些类型的输入(无效输入),如果要返回一个表示相同的值,那么它不会破坏二进制兼容性,这就是JLS所说的。例如。你想返回-1或类似的东西来表示过时参数的通过(而不是抛出或具有未定义的行为)。它是特定于实现的,取决于您希望如何处理此类输入。

答案 1 :(得分:0)

  

更改方法或构造函数以返回输入的值   他们之前要么抛出通常不应该发生的例外

现有代码:

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;
    }
}

我想你了解了。

陈述的实际意义是:

  • 您可以添加功能,让您的方法做一些在成功之前无法做的事情
  • 但是,在保持二进制兼容的情况下,您无法更改已有效输入的现有行为。

这是一种很有说服力的方式,可以说出很多常识。