【发布时间】:2010-02-07 22:50:48
【问题描述】:
我正在开发一款 Java Android 游戏。这里的游戏一般需要使用内存池来避免垃圾回收。
为了论证,假设我有以下类:
// Enemy in the game
class Enemy { int x; int y; abstract void update(); }
// Enemy that just bounces around
class Roamer extends Enemy { int direction; ... }
// Enemy that chases a player
class Chaser extends Enemy { Player target; ... }
// maybe 20 more enemy types...
根据需要使用内存池时,使用子类是一件痛苦的事情,例如说明您需要多少 Roamer 和 Chaser 对象,而不仅仅是您可能需要多少 Enemy 对象。此外,更新的虚函数调用可能很慢。
我想到的另一种选择是将所有这些类合并为一个,例如
class Enemy
{
int direction;
Player target;
int type; // i.e. ROAMER_TYPE, CHASER_TYPE
}
然后我会有一个更新函数来检查“类型”变量并相应地更新。这显然是一种更像 C 的方法。不过感觉很hacky,因为例如漫游敌人将有一个它从不使用的“目标”变量。不过,我一次不太可能在内存中拥有超过 100 个敌人,所以这真的不是什么大问题。我只想在漂亮的代码和速度之间做出妥协。
有没有人知道如何最好地构建这个?像这样合并类是不是太过分了?这是个好主意吗?我应该只使用常规的类树吗?
我知道这个问题没有正确答案,但我想要一些不同的观点。
【问题讨论】:
-
如果您采用第二种方法,请务必使用枚举而不是整数,以确保类型安全。
-
在 android developer.android.com/guide/practices/design/… 下严格不推荐枚举。我真的不喜欢这种方法,因为这意味着我必须输入两次文件名(一次在引号中,一次用于常量)。