Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我们不能概括方法参数,是否需要接口/契约_Java_Oop_Interface - Fatal编程技术网

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

Java 如果我们不能概括方法参数,是否需要接口/契约,java,oop,interface,Java,Oop,Interface,我想创建一个有两种方法的界面,例如uploadFile和downloadFile。虽然我只需要实现者来实现这两种方法,但我不确定,也不想关心这些方法需要采取什么样的论证。我的意思是,不同的实现者可能要求不同的参数。在这种情况下,我是否应该继续创建一个接口,将上述方法设置为var-arg方法,如下所示 boolean uploadFile(Object ... parameters) OutputStream downloadFile(Object ... parameters) 或者还有比这更

我想创建一个有两种方法的界面,例如
uploadFile
downloadFile
。虽然我只需要实现者来实现这两种方法,但我不确定,也不想关心这些方法需要采取什么样的论证。我的意思是,不同的实现者可能要求不同的参数。在这种情况下,我是否应该继续创建一个接口,将上述方法设置为var-arg方法,如下所示

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

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

我认为这仍然可以,因为您至少在合同中定义了
uploadFile
downloadFile
方法。但它允许太多的可能性,因为您将
Object…
定义为这两种方法的参数。也许更好的方法是为这些参数定义一些具体的选项并坚持使用它们。您可以通过这两种方法的多个重载版本来实现这一点

布尔上传文件(文件)


布尔上传文件(文件…


布尔上传文件(文件[])

然后,对该对象执行同样的操作

下载文件
方法。

也许您应该使用

公共接口XXXX{
布尔上传文件(T…参数)
OutputStream下载文件(T…参数)
}

这可能是泛型的一个用例。考虑下面的类安排——在这里我们定义一个抽象的“参数”类型并在接口中引用它。具体类使用特定的参数集

abstract class HandlerParams {    
}       

interface FileHandler<T extends HandlerParams> {
  boolean uploadFile(T parameters);
  OutputStream downloadFile(T parameters);
}
抽象类HandlerParams{
}       
接口文件处理程序{
布尔上传文件(T参数);
OutputStream下载文件(T参数);
}
示例实现:

class URLParams extends HandlerParams {
  // whatever...
}  

class URLFileHandler implements FileHandler<URLParams> {

  @Override
  public boolean uploadFile(URLParams parameters) {
    // ...
  }

  @Override
  public OutputStream downloadFile(URLParams parameters) {
    // ...
  }    
}
类URLPARMS扩展了HandlerParams{
//不管怎样。。。
}  
类URLFileHandler实现FileHandler{
@凌驾
公共布尔上传文件(URLParams参数){
// ...
}
@凌驾
公共OutputStream下载文件(URLParams参数){
// ...
}    
}

我必须承认,我很难想象这种安排会有多大帮助。我想您可以使用文件处理程序,但感觉有点做作:

class SomethingThatUsesFileHandlers {
  public <T extends HandlerParams> void doSomething(FileHandler<T> handler,
      T params) {
    handler.downloadFile(params);
  }
}
class SomethingStatus文件处理程序{
public void doSomething(FileHandler,
T参数){
handler.downloadFile(params);
}
}

如果必须根据实现者的类型使用不同的参数类型/计数进行调用,则有两种常见选择:

  • 将参数本身概括为一个单独的类型-这有助于统一接口,但代价是静态类型检查
  • 完全放弃接口-如果您需要静态类型检查,您建议的选择(不使用接口)是有效的
以下是您如何实施第一种方法:

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

使用泛型怎么样?对于API来说,处理对象类型不是一个好的设计。我们可以传递…我们想要的任何东西。这需要强制转换(透视图中丑陋的if/else)
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();
}