繁体   English   中英

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

[英]How to add a new parameter to existing methods while maintaining backwards compatibility

我们的库包含两个方法: 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方法
  • 我们正在调用刚刚不推荐使用的方法(感觉很不对劲)

对于We're missing a doXForEach method with the additional parameterWe'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);
}

您正在寻找支持多达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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM