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