我正在使用Java开发我的第一个真正的项目。虽然我对动态语言有更多的经验,但我开始对这门语言感到满意。
我有一个类似于以下的类:
class Single
{
public void doActionA() {}
public void doActionB() {}
public void doActionC() {}
}
然后我有一个 SingleList
充当这些类的集合的类(具体来说,它用于2D Sprite库,“actions”是各种变换:旋转,剪切,缩放等)。我希望能够做到以下几点:
class SingleList
{
public void doActionA() {
for (Single s : _innerList) {
s.doActionA();
}
}
... etc ...
}
有没有办法简单地将方法(或已知的方法列表)推迟到内部列表的每个成员?无需专门列出每个方法,然后循环每个内部成员并手动应用它?
为了使事情变得更难,方法是不同的arity,但都是返回类型“void”。
不幸的是,Java并不容易在运行时支持类创建,这正是您所需要的: SingleList
需要使用必要的存根方法自动更新以匹配 Single
类。
我可以想到以下方法来解决这个问题:
使用 Java反射:
- 优点:
- 它随时可用Java语言提供,您可以轻松找到文档和示例。
- 缺点:
- 该
SingleList
上课不兼容 Single
类接口了。
- Java编译器和任何IDE通常无法帮助通过反射调用的方法 - 编译器捕获的错误通常会转换为运行时异常。
- 根据您的使用情况,您可能还会看到明显的性能下降。
使用构建系统以及某种源代码生成器来自动创建 SingleList.java
文件。
- 优点:
- 缺点:
- 设置它有一定的难度。
- 你必须单独确保
SingleList
在任何JVM中加载的类 - 或者您的IDE,就此而言 - 实际上与加载的匹配 Single
类。
手动解决此问题 - 创建界面(例如 SingleInterface
或者两个类使用的基本抽象类应该有帮助,因为任何体面的IDE都会指出未实现的方法。适当的类架构可以最大限度地减少重复的代码,您的IDE可以帮助生成样板部件。
- 优点:
- 没有设置曲线可以克服。
- 您的IDE将始终看到正确的类集。
- 之后通常会改进类体系结构。
- 缺点:
使用字节码生成库,如 了Javassist 要么 BCEL 动态生成/修改 SingleList
即时上课。
- 优点:
- 缺点:
- 通常使用字节码生成库 不 琐事和 不 对于胆小的人。
- 根据您编写代码的方式,您可能还会遇到IDE及其动态类处理问题。