我有一些现有的重载 API:
1). foo(a, b) { return foo(a, b, null); }
2). foo(a, b, c) {return foo(a,b,c,null);}
3). foo(a, b, c, d) { implement of the function...; }
其中a、b、c是一些数据结构,其值也可以为空。 现在我需要使用标志来扩展 API。即
4). foo(a, b, Boolean flag)
5). foo(a, b, c, Boolean flag)
6). foo(a, b, c, d, Boolean flag)
其中 boolean 值可以为 null/false/true; 为了兼容性,现有的 API 应该仍然存在。
问题是:当调用 foo(a, b, null) 时,2) 和 4) 是不明确的。 3) 和 5) 也是如此。
我的问题:一般来说我们应该如何扩展新的 API?
最佳答案
a) 您可以为新方法指定不同的名称。 fooWithFlag
b) 您不能允许 null
(大概它与之前没有标志的方法执行相同的操作),并使用原始 boolean
代替
c) 您可以创建一个子接口(interface) ServiceWithFlags
或 ServiceV2
并仅在其上放置新方法。新代码可以通过使用新接口(interface)来使用它,旧代码仍然使用旧接口(interface)并且不会看到方法。
d) 这只是一个编译时错误。这不会破坏已经编译的代码。所以您实际上可以继续添加新方法。任何歧义都会被编译器捕获,并在开发过程中轻松修复。
关于java - 如何在java中扩展以下API函数而不导致二义性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28736276/