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 ,例如RectCollider
和 CircleCollider
。
这些的多个实例都在同一个 List<Collider> colliders
.
现在,我的问题是我应该如何检查这些对撞机之间的碰撞,同时保持它们之间的兼容性。例如,我想检查 RectCollider
和另一个 RectCollider
之间的冲突不同于检查 RectCollider
和 CircleCollider
.
到目前为止,我的想法是使用一种方法来检查碰撞体的类型(通过 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 为您优化。
考虑以下几点:
有一个 abstract class Collider
和一些扩展此 class 的 class ,例如RectCollider
和 CircleCollider
。
这些的多个实例都在同一个 List<Collider> colliders
.
现在,我的问题是我应该如何检查这些对撞机之间的碰撞,同时保持它们之间的兼容性。例如,我想检查 RectCollider
和另一个 RectCollider
之间的冲突不同于检查 RectCollider
和 CircleCollider
.
到目前为止,我的想法是使用一种方法来检查碰撞体的类型(通过 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 为您优化。