【问题标题】:Java: Most efficient way of calling different methods depending on the parameter type, which all share the same superclassJava:根据参数类型调用不同方法的最有效方式,它们都共享相同的超类
【发布时间】:2019-02-05 14:13:38
【问题描述】:

考虑以下几点: 有一个 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));

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

【问题讨论】:

  • 如果你在 Collider 的每个实现上都实现了getCollision(Collider b),那会不会那么混乱。代码量将是相同的,但会在实现中分开。在性能方面,没有真正的区别。

标签: java methods types instanceof


【解决方案1】:

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

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

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

关于执行性能,没关系。 JVM 会为您优化这一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多