java - 具有可变返回类型和可变输入参数的 java 方法

标签 java design-patterns

我有一个抽象 Java 类“BaseOperation”。这个类只有一个抽象方法:

public abstract T execute()
{
    ...

    return T;
}

BaseOperation 的子类必须实现这个方法:

public class GetUsersOperation extends BaseOperation<GetUsersResponse>
{
    ...

    @Override
    public GetUsersResponse execute()
    {

        ...

        return GetUsersResponse;
    }

}

这是将所有常见“操作”逻辑放在 BaseOperation 类中的好方法,但每个具体子类的 execute() 方法仍具有不同的返回类型.

现在我需要更改此结构以允许 execute() 方法具有可变数量的参数。例如,一个具体的子类需要:

execute(String, int)

另一个需要:

execute(Date, Date, String)

这很棘手,因为 execute 方法是在基类中声明的。简单地重载基类中的执行方法并不理想。首先,过载量会很大。其次,每个子类只会使用其中一种执行方法,其他所有方法有什么意义?

(在我看来)最简单的解决方案是使用可变参数声明执行方法:

execute(Object... arguments)

然后向下转换子类中的所有参数:

execute(Object... arguments)
{
    String s = (String) arguments[0];
    ...
}

显然这有两个主要缺点:

  • 由于所有向下转换操作导致性能下降
  • 调用 execute() 方法不再是严格类型化的,因​​为可以传递任意数量的对象而不会出现编译器警告。

是否存在可以避免这些缺点的模式或其他解决方案?

最佳答案

您可以使用一个包含参数的 bean:

public interface BaseOperation<T, U> {
    T execute(U input);
}

public class GetUsersOperation implements BaseOperation<GetUsersResponse, UserInput> {

    @Override
    public GetUsersResponse execute(UserInput input) {
        Date date = input.getDate();
        return new GetUsersResponse(date);
    }

}

你的抽象类只有一个抽象方法:最好使用接口(interface)。您可以实现多个接口(interface),而只能扩展一个类。

关于java - 具有可变返回类型和可变输入参数的 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28189138/

相关文章:

java - 添加密码字段 - GUI

java - java中的设计模式

iphone - 委托(delegate)时让 Xcode 删除 "No XXX method found"警告

java - 在 Swing 中使用单例设计模式

c# - Session Per Request 模式是如何工作的?

JQuery Web 应用程序设计模式

java - @OneToMany 列返回 LazyInitializationException - Spring

java - 访问android中重写方法的参数的子方法?

java - aws lambda 测试控制台中的 config.properties 出现 FileNotFoundException

java - 初学者Java android studio错误