我目前正在尝试创建一个系统,在该系统中,我希望能够在运行时为类分配唯一的家庭 ID。本质上,我希望能够在运行时注册后基于整数值区分类。
用例是该系统将用作组件系统的官僚机构。所有类都是类 Component 的后代(不一定直接);并在运行时注册。
我希望能够这样做有几个原因:
- 扩展的轻松和安全:人们不必修改基础组件系统中的巨大列表来添加组件。
- 效率:内部查找是使用这个整数值完成的,因此可以是 O(1) 而不是搜索查找。由于这些组件将构成系统的大部分,因此我不希望将其设为实例变量。我不能忽略这方面,因为测试用例已经表明我无法承受 > O(1) 的删除和插入。(第一个实现使用地图查找表)
我正在寻找一个编译时检查的实现;不是基于合同的解决方案。Java中基于合约的解决方案是:
interface Component {
// Should return the value of a static variable
int getFamilyID();
int setFamilyID(int id);
}
class Foo implements Component {
static int familyID = 0;
int getFamilyID(){ return familyID; }
int setFamilyID(int id){ familyID = id; }
}
class System { // Singleton
static int registeredComponents = 0;
void register(Component c){ c.setFamilyID(registeredComponents++); }
}
这显然行不通,原因有两个:
- 除非我将变量公开,否则我无法指定 A.getFamilyID();用例:c.getFamilyID() == Foo.getFamilyID(); (而不是实例)
- 到处都是冗余代码;Component 的每个实现都需要复制粘贴的实现。
我认为我可以使用指定静态变量的模板来解决 C++ 中的问题,但是当类不是 Component 的直接后代时,这将变得不可用。
我也不能在 Java 中使用枚举,因为它们是特定于语言的,并且组件的数量会使单个文件的代码变得庞大。(另外;它们都必须在一个地方再次指定)
在这件事上的任何帮助或对我为什么要“做错事”(TM)的见解都会很有帮助:-)
编辑:为了澄清,我想要一些方法来确保在编译时可以在组件类中设置的静态整数的代码约定。