Man*_*lva 6 java backwards-compatibility
我有以下API:
public interface MyApi {
/**
* Performs some stuff.
* @throws MyException if condition C1
*/
public void method() throws MyException;
}
Run Code Online (Sandbox Code Playgroud)
我现在正在API实现中执行以下修改
public class MyApiImpl {
public void method() throws MyException {
if (C1) {
throw new MyException("c1 message");
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
被替换为:
public class MyApiImpl {
public void method() throws MyException {
if (C1) {
throw new MyException("c1 message");
} else if (c2) {
throw new MyException("c2 message");
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
你认为这是一个API破坏?
客户端的代码仍然会编译,但API javadoc定义的方法契约不再受到尊重,因为MyExcepiton被"新"条件抛出.
如果只更新了我的API jar文件,客户端应用程序仍然可以工作,但根据客户端捕获异常的方式,应用程序行为可能会发生很大变化.
你对此持何看法?
我的观点是,您不应该更改文档中API定义的合同.如果你需要新的行为,你应该a.)创建一个可以由客户调用反映这种新行为的新方法,或者b.)与客户讨论变更的需要并让他们意识到这一点.
这真的可以双管齐下,在您和您的客户之间,您的方法将是什么.
| 归档时间: |
|
| 查看次数: |
610 次 |
| 最近记录: |