如何在保持向后兼容性的同时向现有方法添加新参数

时间:2019-04-23 15:22:17

标签: java

我们的库包含两种方法:doXForAlldoXForEach

default List<Object> doXForAll(Object input1) {
    return Collections.singletonList(doXForEach(input1));
}

default Object doXForEach(Object input1) {
    return doX(input1); // Some kind of default behaviour over the input
}

我们鼓励客户使用自己的实现重写这些默认方法。我们需要保持谨慎,不要进行任何会破坏现有功能的更改。

问题:

我们想在上述两种方法中增加对额外参数Object input2的支持。您如何建议在不要求我们的客户更新其实现的情况下进行此操作?

我们当前的解决方案:

default List<Object> doXForAll(Object input1, Object input2) {
    return doXForAll(input1);
}

与此有关的问题是:

  • 我们缺少带有附加参数的doXForEach方法
  • 我们正在调用我们刚刚不赞成使用的方法(感觉不对)

2 个答案:

答案 0 :(得分:1)

对于We're missing a doXForEach method with the additional parameter点, 是什么阻止您创建这个?

对于We are calling methods we've just deprecated (which feels wrong), 您不应该调用不推荐使用的方法。

例如只需创建除现有内容外的其他内容即可

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

答案 1 :(得分:1)

您正在寻找支持多达16种可能方案的前景。以下四种情况可以分别独立发生,因此2 ^ 4 = 16。

  1. 客户端不/不覆盖doXForAll(Object input1)
  2. 客户端不/不覆盖doXForEach(Object input1)
  3. 客户端不/不覆盖doXForAll(Object input1, Object input2)
  4. 客户端不/不覆盖doXForEach(Object input1, Object input2)

如果实施当前的解决方案,那么您将遇到以下不幸的结果:

  • 如果,客户端同时覆盖doXForAll(Object input1)doXForAll(Object input1, Object input2)
  • ,并且您通过界面致电doXForAll(Object input1, Object input2)
  • 然后将客户的doXForAll(Object input1)称为
  • 但是,客户可能希望呼叫doXForAll(Object input1, Object input2)

为防止此类意外,最好将新方法与旧方法不同,并分别覆盖它们。