是否应在一个列表中更新多态对象

时间:2016-02-14 21:30:34

标签: java oop polymorphism

我有以下设置:

public abstract class Entity {
    public abstract void update();
}
public class Particle extends Entity {
    // ...
}
public class Enemy extends Entity {
    // ...
}

我需要知道每一帧敌人的数量:

if (numEnemies > 50)
    doSomething();

那么,以下哪一项是更合适的设计?

选项1:

List<Entity> enemies;
List<Entity> players;
// ...
    int numEnemies = enemies.size();
    for (Entity i : enemies)
        i.update();
    for (Entity i : players)
        i.update();

选项2:

List<Entity> entities;
int numEnemies = 0;
// ...
    if (needMoreEnemies()) {
        ++numEnemies; // Keep a count and decrease on removal
        entities.add(new Enemy());
    }
    for (Entity i : entities)
        i.update();

还是别的什么呢?

2 个答案:

答案 0 :(得分:3)

选项2更好。对于更好的OOP,&#34;需要更多的敌人&#34;块应该放在Enemy类中,可能作为静态方法,或者可能在更新方法中。这将允许其他类具有每帧一次&#34;#34;检查。

当然,而不是:

for (Entity i : entities)
    i.update();

使用Java 8样式:

entities.stream().forEach(Entity::update);

答案 1 :(得分:2)

如果您不必单独处理enemiesplayers,则第二种方法更好:保持单独计数并在所有其他情况下以多态方式处理对象更容易。

另一方面,如果您有时需要将对象隔离以进行单独处理,那么第一种方法会更好。