我有一种情况,我使用反射在运行时根据它们的完全限定类名创建对象。所有的对象都扩展了同一个抽象类,所以它们的一般类型在编译时是已知的,但具体的实现是由运行时提供的类名决定的。
抽象类提供了一个名为create的静态方法,该方法接受类名和用于构造具体对象的其他参数。每个响应都有一个实际类型A和一个存储类型s。实际类型是数据在Java中的"适当"表示,存储类型是存储在数据库中的东西。例如,A可能是一个Date对象,S可能是同一个Date对象,转换成Long类型存储在SQLite中。
这里是一个简化的表示:
public abstract class Response<A, S> {
public Response(String clazz, Object value, boolean actual) {
this.clazz = clazz;
if (actual) {
actualValue = (A) value;
} else {
actualValue = toActualValue((S) value);
}
}
public static Response create(String clazz, Object value) {
//create response by reflection
return response;
}
}
这个工作正常,直到我现在必须处理这样一个事实:除了每个响应实现接受的两个参数之外,一些响应实现现在需要接受额外的参数。
这些附加参数不能通过setter方法传递,因为它们通常用于从抽象响应构造函数中调用的包私有方法toActualValue()
。
我考虑过使用Builder模式来处理可选参数,但是我需要一种方法来确定哪个响应实现采用哪个参数——而且我想不出一种干净的方法来提供该信息。也许我完全想错了。如有任何有用的见解或建议,我们将不胜感激。
您考虑过使用任意数量的参数吗?
public TestClass(String clazz, Object value, boolean actual, Object... parms) {
this.clazz = clazz;
if (actual) {
actualValue = (A) value;
} else {
//actualValue = toActualValue((S) value, parms);
}
}
https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html