我正在为DB访问创建API。
如果我想将参数类型从接口更改为实现类型。
例如,
API版本1.0:
getDomain1Data(SearchBy searchBy,List<String> someList);
我可以将其更改为下面吗?我想确保API用户不会使用其他域的表列名称搜索domain1
数据。
getDomain1Data(Domain1SearchBy searchBy,List<String> someList);
如果我这样做应该添加到第一个方法,然后添加第二种方法,或者我可以将第一个方法替换为第二种方法。
谢谢。
如果已经有一个应用程序使用您的接口方法,则删除上一个方法是不明智的。我宁愿添加getDomain1Data(Domain1SearchBy searchBy,List<String> someList);
并将@Deprecated
注释添加到上一个。
示例代码:
@Deprecated
static interface SearchBy {
}
static class Domain1SearchBy implements SearchBy {
}
static interface Api10 {
void some(SearchBy a);
}
static interface Api11 extends Api10 {
void some(Domain1SearchBy b);
}
static class Api10Impl implements Api10 {
@Deprecated
public void some(SearchBy a) {
System.out.println("some searchby");
}
}
static class Api11Impl extends Api10Impl implements Api11 {
public void some(Domain1SearchBy b) {
System.out.println("some domain1");
}
}
public static void main(String[] args) {
//with api 1.0
Api10 api10 = new Api10Impl();
api10.some(new SearchBy() {});
api10.some(new Domain1SearchBy());
//with api 1.1
Api11 api11 = new Api11Impl();
api11.some(new SearchBy() {});
api11.some(new Domain1SearchBy());
}
结果:
some searchby
some searchby
some searchby
some domain1
如果您正在更改正在使用的方法(在这种情况下),那么我认为正确的方法是添加新方法并将@deprectated标签添加到旧方法,解释了为什么已弃用它,以及应该使用哪种方法。
您不能仅将第一个替换为第二个,因为客户端可以将其称为 SearchBy
对象为acutual参数。这将比导致编译错误。
使用两种方法也不可能,因为它们是歧义的。如果使用Domain1SearchBy
对象调用两种方法都适用,因此不能决定使用哪种方法。
您仅有两个选项是给新彼此的名称或更改参数计数。