我有一个束类,有一组独特的方法。
class1 {
method1(dbconn, args...);
method2(dbconn, args...);
}
class2 {
method3(dbconn, args...);
method4(dbconn, args...);
}
class3 {
method5(dbconn, args...);
}
我们需要通过平面库公开所有方法:
class library {
init () {
//create instance of all helper classes
}
method1(args...) {
return class1Instance.method1(getDbconn(), args...);
}
method2(args...) {
return class1Instance.method2(getDbconn(), args...);
}
method3(args...) {
return class2Instance.method3(getDbconn(), args...);
}
method4(args...) {
return class2Instance.method4(getDbconn(), args...);
}
method5(args...) {
return class3Instance.method5(getDbconn(), args...);
}
}
但这非常耗时,并且有很多重复的代码将每个方法移动到库中。有更好的方法吗?
请注意,每个方法名称都是唯一的。参数和返回值有不同的类型。
答案 0 :(得分:0)
定义一个接口:
interface library {
method1();
...
methodN();
}
然后使用动态代理反射性地调用服务实现的方法。您还必须找到有关如何选择应调用特定方法的服务的解决方案。但这不是很难。
你可以实现一个类:
class ServiceDemultiplexer implements InvocationHandler {
ServiceDemultiplexer(Object services[]) {
...
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable
{
...
}
}
答案 1 :(得分:0)
更好的方法是避免这样做。
一个班级应该有一套明确的,尽可能一致的责任。如果所有这些类都存在,那肯定是因为每个类都有一组不同于其他类的责任。为什么不让调用者选择要使用的相应类,并从该类调用适当的方法。
您可以将Library
类用作帮助程序类的工厂。呼叫者只需要做
library.getClass1().method1(...);
如果你说出真名,那就更自然了:
library.getProductManager().createProduct();
但即便如此,将特定依赖项注入调用者对象看起来比依赖像这样的大型工厂更好。使用依赖注入框架,如Spring或Guice。
答案 2 :(得分:0)
根据您正在处理的内容以及使用反射不是问题,您可以通过动态代理调用所有内容。
http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html
你的 InvocationHandler.invoke 只会找到在其参数中声明 Method m 的类和方法,实例化该类的对象(可以比这更快地完成)并且将呼叫传递给它。实际的实施取决于你已经拥有的东西。