我想创建一个包含两种方法的界面,比如uploadFile
和downloadFile
。虽然我只需要实现者来实现这两种方法,但我不确定并且想要关注这些方法需要采取的争论。我的意思是,不同的实现者可能会要求不同的参数。在这种情况下,我是否仍然可以通过将上述方法作为var-arg方法来创建接口,如下所示
boolean uploadFile(Object ... parameters)
OutputStream downloadFile(Object ... parameters)
还是有比这更好的方法吗?如果我不能概括方法参数,创建接口是否正确?我只确定方法名称并说出返回类型。
答案 0 :(得分:2)
这可能是泛型的用例。考虑以下类的排列 - 这里我们定义一个抽象的“参数”类型,并在接口中引用它。具体类使用特定的参数集。
abstract class HandlerParams {
}
interface FileHandler<T extends HandlerParams> {
boolean uploadFile(T parameters);
OutputStream downloadFile(T parameters);
}
示例实现:
class URLParams extends HandlerParams {
// whatever...
}
class URLFileHandler implements FileHandler<URLParams> {
@Override
public boolean uploadFile(URLParams parameters) {
// ...
}
@Override
public OutputStream downloadFile(URLParams parameters) {
// ...
}
}
我必须承认,我很难想象这种安排会有所帮助的情况。我想你可以有一些适用于文件处理程序的东西,但感觉有点人为:
class SomethingThatUsesFileHandlers {
public <T extends HandlerParams> void doSomething(FileHandler<T> handler,
T params) {
handler.downloadFile(params);
}
}
答案 1 :(得分:1)
如果必须根据实现者的类型使用不同的参数类型/计数进行调用,则有两种常见的选择:
以下是您实施第一种方法的方法:
interface HandlerParameters {
void setValue(String mame, Object value);
Object getValue(String name);
String[] getNames();
}
interface UploadDownloadHandler {
boolean uploadFile(HandlerParameters parameters);
OutputStream downloadFile(HandlerParameters parameters);
HandlerParameters makeParameters();
}
调用者可以调用makeParameters
来创建一个空参数块,根据需要填充参数值,然后继续调用uploadFile
或downloadFile
。
答案 2 :(得分:0)
我认为这仍然没问题,因为您至少在合同中定义了uploadFile
和downloadFile
方法。但它允许太多可能性,因为您将Object...
定义为两种方法的参数。也许更好的方法是为这些参数定义一些具体选项并坚持下去。您可以通过这两种方法的几个重载版本来完成此操作,例如
boolean uploadFile(File)
或
boolean uploadFile(File...)
或
boolean uploadFile(File[])
然后为
做同样的事情 downloadFile
方法。
答案 3 :(得分:0)
也许您应该使用generic interface?
public interface XXXX< T > {
boolean uploadFile(T... parameters)
OutputStream downloadFile(T... parameters)
}