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