2014-04-10 62 views
2

我们是否需要一个接口/合同?我想创建一个有两种方法的接口,如uploadFiledownloadFile。虽然我只需要实现者来实现这两种方法,但我不确定并想关心这些方法需要采取什么论点。我的意思是,不同的执行者可能会要求不同的参数。在这种情况下,我应该仍然继续通过创建使上述方法为VAR-ARG方法的接口,像下面如果我们不能概括方法参数

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

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

+2

如何使用泛型?处理对象类型对于API来说并不是一个好设计..我们可以通过......任何我们想要的东西......这将需要被施放(如果/其他角度看起来很丑陋) – Mik378

回答

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); 
    } 
} 
0

我认为这还是可以的,因为您至少有合同中定义的uploadFiledownloadFile方法。但它允许太多的可能性,因为您将Object...定义为这两种方法的参数。也许更好的方法是为这些参数定义一些具体的选项并坚持下去。您可以通过这两种方法的几个重载版本来完成此操作,例如

boolean uploadFile(File)

boolean uploadFile(File...)

boolean uploadFile(File[])

,然后执行相同的

downloadFile方法。

0

也许你应该使用generic interface

public interface XXXX<T> { 
    boolean uploadFile(T... parameters) 
    OutputStream downloadFile(T... parameters) 
} 
1

  • 期广义参数本身到一个单独的类型 - 这可以帮助你在静态类型的检查
  • 放弃界面完全成本统一接口 - 如果你需要统计ic类型检查,您建议的选择(离开接口)是有效的。

这里是你如何实现第一种方法:

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

相关问题