Java 如何在保持向后兼容性的同时向现有方法添加新参数
我们的库包含两种方法:Java 如何在保持向后兼容性的同时向现有方法添加新参数,java,Java,我们的库包含两种方法:doXForAll和doXForEach: 默认列表doXForAll(对象输入1){ 返回集合。singletonList(doXForEach(input1)); } 默认对象doXForEach(对象输入1){ 返回doX(input1);//输入上的某种默认行为 } 我们鼓励客户机用自己的实现覆盖这些默认方法。我们需要谨慎,不要做出任何会破坏现有功能的更改 问题是: 我们希望在上述两种方法中添加对额外参数Object input2的支持。您建议如何在不要求我们的客
doXForAll
和doXForEach
:
默认列表doXForAll(对象输入1){
返回集合。singletonList(doXForEach(input1));
}
默认对象doXForEach(对象输入1){
返回doX(input1);//输入上的某种默认行为
}
我们鼓励客户机用自己的实现覆盖这些默认方法。我们需要谨慎,不要做出任何会破坏现有功能的更改
问题是:
我们希望在上述两种方法中添加对额外参数Object input2
的支持。您建议如何在不要求我们的客户更新其实现的情况下进行此操作
我们当前的解决方案:
默认列表doXForAll(对象输入1,对象输入2){
返回doXForAll(输入1);
}
这方面的问题是:
- 我们缺少一个带有附加参数的
方法doXForEach
- 我们正在调用刚刚弃用的方法(感觉不对)
- 对于
我们缺少一个带有附加参数的doXForEach方法
点,
是什么阻止你创造这个
至于,我们正在调用我们刚刚弃用的方法(感觉不对)
,
您不应该调用不推荐的方法
例如,在已有的基础上再创建类似的内容:
default List<Object> doXForAll(Object input1, Object input2) {
return Collections.singletonList(doXForEach(input1, input2));
}
default Object doXForEach(Object input1, Object input2) {
return doX(input1, input2);
}
默认列表doXForAll(对象输入1,对象输入2){
返回集合.singletonList(doXForEach(input1,input2));
}
默认对象doXForEach(对象input1、对象input2){
返回doX(输入1,输入2);
}
对于我们缺少一个带有附加参数的doXForEach方法
点,
是什么阻止你创造这个
至于,我们正在调用我们刚刚弃用的方法(感觉不对)
,
您不应该调用不推荐的方法
例如,在已有的基础上再创建类似的内容:
default List<Object> doXForAll(Object input1, Object input2) {
return Collections.singletonList(doXForEach(input1, input2));
}
default Object doXForEach(Object input1, Object input2) {
return doX(input1, input2);
}
默认列表doXForAll(对象输入1,对象输入2){
返回集合.singletonList(doXForEach(input1,input2));
}
默认对象doXForEach(对象input1、对象input2){
返回doX(输入1,输入2);
}
您希望支持多达16种可能的方案。以下四种情况可以单独发生,因此2^4=16
doXForAll(对象输入1)
doXForEach(对象输入1)
doXForAll(对象input1,对象input2)
doXForEach(对象input1,对象input2)
- 如果客户端同时覆盖
和doXForAll(对象输入1)
doXForAll(对象输入1,对象输入2)
- 和通过界面调用
doXForAll(对象输入1,对象输入2)
- 然后将调用客户端的
doXForAll(对象输入1)
- 但是客户端可能希望调用
doXForAll(objectinput1,objectinput2)
为了防止出现这种意外情况,最好将新方法与旧方法区别对待,并将它们分别覆盖。您希望支持多达16种可能的方案。以下四种情况可以单独发生,因此2^4=16
doXForAll(对象输入1)
doXForEach(对象输入1)
doXForAll(对象input1,对象input2)
doXForEach(对象input1,对象input2)
- 如果客户端同时覆盖
和doXForAll(对象输入1)
doXForAll(对象输入1,对象输入2)
- 和通过界面调用
doXForAll(对象输入1,对象输入2)
- 然后将调用客户端的
doXForAll(对象输入1)
- 但是客户端可能希望调用
doXForAll(objectinput1,objectinput2)
为了防止出现这种意外情况,最好将新方法与旧方法区别对待,并将它们单独重写。您能不能为这些方法创建一个重载?是的,但如果它成为入口点,将不再调用现有的客户端重写,因此,打破现有功能只有在提供新参数时,它才会成为入口点。。。。如果现有客户机希望他们的代码也使用新参数作为入口点,那么他们也必须重写重载。为什么会这样?如果它们具有对
doXForAll(Object input1)
的重写,则创建doXForAll(Object input1,Object input2)
重载不应导致任何问题(@Arachin),您能否为这些方法创建一个重载?是的,但如果它成为入口点,将不再调用现有的客户端重写,因此,打破现有功能只有在提供新参数时,它才会成为入口点。。。。如果现有客户机希望他们的代码也使用新参数作为入口点,那么他们也必须重写重载。为什么会这样?如果它们具有对doXForAll(objectinput1)
的重写,则创建一个doXForAll(Obj