Java:根据参数类型调用不同方法的最有效方式,它们都共享相同的超类

Java: Most efficient way of calling different methods depending on the parameter type, which all share the same superclass

考虑以下几点: 有一个 abstract class Collider 和一些扩展此 class 的 class ,例如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));

但是,我不确定这是否真的是 fastest/best 方法,因为当添加更多 Collider 类型时,此方法会变得过于复杂。

这样,当您添加新的子类时,您的方法大小会按二次方缩放。您是否可以简单地这样做取决于您调用的方法(rectRect、rectCircle 等)。

是否所有这些方法都不相关,或者每个具有相同形状的方法是否具有共同的行为?在前一种情况下,你运气不好。在后一种情况下,您可能希望在 Collider 的子类中定义此行为并添加提取此行为的通用方法。这可以是恒定大小,例如:

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

关于执行性能,无所谓。 JVM 为您优化。