我正在编写一个游戏,并且有一个名为 GameObject 的抽象类和三个扩展它的类(Player、Wall 和 Enemy)。
我有一个定义为包含游戏中所有对象的列表。
List<GameObject> objects;
当我需要对其中一个对象执行某些操作时,我会这样做:
public void update() {
for(GameObject o : objects) {
if(o instanceof Wall) {
// do something
}
else if(o instanceof Player) {
// do something
}
else if(o instanceof Enemy) {
// do something
}
}
}
正如您所看到的,我必须遍历整个列表并检查类型才能找到单个对象。在我看来,这效率不高。所以我然后考虑将不同的派生类存储在它们自己的列表中。
private List<Wall> walls;
private List<Enemy> enemies;
private Player player; // only one
这比遍历包含所有内容的整个列表并检查其类型来决定是否执行某些操作会更有效吗?非常感谢。
最佳答案
执行此操作的正常方法是使用 GameObject 上的接口(interface)。
public interface GameObject {
void update();
}
然后让每个对象实现 GameObject。
public class Player implements GameObject {
public void update() { // update player...
}
public class Wall implements GameObject {
public void update() { // probably do nothing...
}
public class Enemy implements GameObject {
public void update() { // update enemy...
}
然后你的更新循环看起来像这样。
public void update() {
for(GameObject o : objects) {
o.update();
}
}
我不能向你保证这会更快,但很可能是这样。编译器可能能够优化这样的虚拟调用(虚拟调用在面向对象编程中很常见,因此编译器知道如何优化确实是一件好事),但我认为它不能几乎也优化了实例类类型的显式检查。
关于Java ArrayList 效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27577193/