Java:根据参数类型调用所有相同的超类的最有效方法

时间:2019-02-05 14:13:38

标签: java methods types instanceof

请考虑以下内容: 有abstract class Collider和其他一些扩展该类的类,例如RectColliderCircleCollider。 它们的多个实例都在同一List<Collider> colliders中。

现在,我的问题是我应该如何检查这些对撞机之间的碰撞,同时保持它们之间的兼容性。例如,我要检查RectCollider和另一个RectCollider之间的冲突,而不是检查RectColliderCircleCollider

到目前为止,我的想法是使用一种方法(通过instanceof)检查对撞机属于哪种类型,然后根据结果调用不同的方法:

public Collision getCollision(Collider a, Collider b) {
    if(a instanceof RectCollider) {
        if (b instanceof CircleCollider) {
            return rectCircle(a, b);
        }
        else if (b instance of RectCollider) {
            return rectRect(a, b);
        }
    }
    else if(a instanceof CirlceCollider) {
        if (b instanceof CircleCollider) {
            return cirlceCircle(a, b);
        }
        else if (b instance of RectCollider) {
            return rectCircle(b, a); 
        }
    }
    else {
        return null;
    }
}

此方法的当前调用方式:

getCollision(colliders.get(i), colliders.get(i+1));

但是,我不确定这是否是最快/最好的方法,因为当添加更多对撞机类型时,该方法会变得非常复杂。

1 个答案:

答案 0 :(得分:0)

这样,当您添加新的子类时,方法大小将按平方缩放。是否可以简单地做到这一点,取决于要调用的方法(rectRect,rectCircle等)。

所有这些方法都是不相关的吗,还是每个形状相同的方法都具有共同的行为?在前一种情况下,您不走运。在后一种情况下,您可能想在Collider的子类中定义此行为,并添加提取该行为的常规方法。这样的大小可以是固定的,例如:

public Collision getCollision(Collider a, Collider b) {
    Force f1 = a.getCollisionInfo();
    Force f2 = b.getCollisionInfo();
    return new Collision(f1, f2);
}

关于执行性能,没关系。 JVM为您优化了所有功能。