在界面中我有一个抽象方法
Server launchInstance(
Instance instance,
String name,
Set<String> network,
String userData)
throws Exception;
现在在我的类中实现了前面的接口,我重写了这个方法,但是我不需要所有的参数,因为这会导致很多不必要的任务。在我实现的课程中,我想做类似的事情 -
@override
Server launchInstance(Instance instance, String name) throws Exception;
如何在覆盖时从我的实现(来自Interface)类中删除一些不必要的参数?
答案 0 :(得分:1)
Java无法做到这一点。
接口定义了所有实现类必须支持的方法,以便拥有统一 API。 一个目的是能够交换实现。
我看到了几个选项:
使用较少的参数向接口添加第二种方法。 但是,这当然要求所有实现都支持这一点。 因此,这可能对您不适用。
实现额外的第二个接口,该接口使用两个参数定义方法。
if (x instanceof Server2)
// short-cut: do not need to compute network and userData
((Server2) x).launchInstance(instance, name)
else {
Set<String> network = …;
x.launchInstance(instance, name, network, userData)
}
只需忽略其他参数。
如果您迫切需要一个统一的接口并希望避免额外参数的计算成本,请使用延迟评估(例如在T
中)包装类型为Callable<T>
的可选参数。如果您不需要这些值,则永远不要调用Callable。
答案 1 :(得分:1)
Interface是多个类的通用API。根据设计,您不希望接口实现更改API。
但是,您可以省略未使用的参数:
@Override
Server launchInstance(Instance instance, String name, Set<String> network, String userData) throws Exception {
launch(instance, name);
}
private Server launch(Instance instance, String name) throws Exception {
...
}
或提供Data
对象:
class Data {
private Instance instance;
private String name;
private Set<String> network;
private String userData;
}
@Override
Server launchInstance(Data data) {
...
}
也可以使用依赖注入来简化接口(读取数据传输)。
答案 2 :(得分:0)