如果我们不能概括方法参数,我们是否需要接口/契约

时间:2014-04-10 10:16:23

标签: java oop interface

我想创建一个包含两种方法的界面,比如uploadFiledownloadFile。虽然我只需要实现者来实现这两种方法,但我不确定并且想要关注这些方法需要采取的争论。我的意思是,不同的实现者可能会要求不同的参数。在这种情况下,我是否仍然可以通过将上述方法作为var-arg方法来创建接口,如下所示

boolean uploadFile(Object ... parameters)
OutputStream downloadFile(Object ... parameters)

还是有比这更好的方法吗?如果我不能概括方法参数,创建接口是否正确?我只确定方法名称并说出返回类型。

4 个答案:

答案 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来创建一个空参数块,根据需要填充参数值,然后继续调用uploadFiledownloadFile

答案 2 :(得分:0)

我认为这仍然没问题,因为您至少在合同中定义了uploadFiledownloadFile方法。但它允许太多可能性,因为您将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)
}