实现以各种指定方式组合同一接口的一些实例的接口的最佳方法是什么?我需要对多个接口执行此操作,并且希望最大限度地减少样板文件并仍然实现良好的效率,因为我需要为关键的生产系统执行此操作。
这是问题的草图。
抽象地说,我有一个通用的组合器类,它接受实例并指定各种组合器:
class Combiner<I> {
I[] instances;
<T> T combineSomeWay(InstanceMethod<I,T> method) {
// ... method.call(instances[i]) ... combined in some way ...
}
// more combinators
}
现在,假设我想实现以下接口以及其他接口:
Interface Foo {
String bar(int baz);
}
我想最终得到这样的代码:
class FooCombiner implements Foo {
Combiner<Foo> combiner;
@Override
public String bar(final int baz) {
return combiner.combineSomeWay(new InstanceMethod<Foo, String> {
@Override public call(Foo instance) { return instance.bar(baz); }
});
}
}
现在,如果接口有很多方法,这很快就会变得冗长而冗长。我知道我可以使用 Java 反射 API 的动态代理来实现此类接口,但通过反射访问方法要慢一百倍。那么在这种情况下,除了样板文件和反射之外还有什么替代方案呢?
我会建议动态代理 - 它真的比现在的常规方法调用慢得多吗 - 我听说反射在幕后发挥了相当大的魔力来加速重复的方法调用。 (如果速度慢了 100 倍,你确定你会注意到吗?好吧,只需重新阅读你的问题 - 你就会注意到!)
否则,您的问题基本上已经有了解决方案:使用 Command 对象将每个方法包装在您的界面中。然后,您可以将接口集合中的每个实例传递给命令对象进行处理。
当然,如果您有勇气和冒险精神,您可以使用动态类生成(使用 cglib、javassist 等)来生成命令对象的实现以及组合器接口的实现动态字节码生成器 http://java-source.net/open-source/bytecode-libraries。这将避免样板文件。
您还可能在方面方面取得一些成功,特别是在编译时或加载时编织方面的aspectJ,因此您可以避免反射开销。抱歉我无法提供详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)