关于"binary compatibility"的问题



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

更改方法或构造函数以返回其输入的值以前引发了通常不应该发生的异常,或者由进入无限循环或导致死锁

我不理解这个想法。

请帮助澄清并举例说明。

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

现有代码:

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

我想你明白了。

这些陈述的实际意义是:

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

这是一种很有意思的表达方式。

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

int myMethod(int arg);

现在JLS说的是

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


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

假设对于一些无效输入(比如你的方法只设计用于正整数,而你通过了其他输入(,该方法要么抛出一些异常(作为验证的一部分或其他(,要么将结果输入到一些未定义的行为中,如无限循环等。

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

相关内容

最新更新