我有一个抽象 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/