我正在编写各种组件的模拟,有些是动态的。最合乎逻辑的结构是这样的:
class Simulation {
int getSimulationTime() {
...
}
class Thing1 {
...
}
class Thing2 {
...
}
Container <Thing1> box1;
Container <Thing2> box2;
...
void addThing1(Thing1 thing) {
box1.add(thing);
}
Thing1 getThing1() {
return box1.getOne();
}
...
}
这个结构至少有两件好事:
Thing1
和Thing2
可以访问模拟时间,而无需明确随身携带Simulation
。
类型系统将确保我不会意外地混淆两种不同模拟的组件:如果我写simulation1.addThing1(simulation2.getThing1());
,编译器将(正确地)拒绝它,因为生成的Thing1
是与Thing1
要求的类型不同。
实际的Thing1
和Thing2
类定义太大了,我想要推入Simulation
类,Java不允许内部类定义被拔出分成单独的文件。有没有其他方法可以实现这些目标?
我刚刚意识到我至少可以使用泛型来帮助完成第二部分 在外部,通过使用内部类为模拟的每个实例提供不同的类型标识:
class Simulation {
class Identity {
Identity(){}
}
Container<Thing1<Identity>> box1;
Thing1<Identity> getThing1() {
return box1.getOne();
}
void addThing1(Thing1<Identity> thing1) {
box1.add(thing1);
}
}
class Thing1<ID> {
...
}
现在,如果我尝试simulation1.addThing1(simulation2.getOne())
,我会收到错误,因为相关的Thing1
又有不同的类型。然而,这个解决方案不够漂亮,并且不能很好地处理可见性。