[英]Java: Most efficient way of calling different methods depending on the parameter type, which all share the same superclass
請考慮以下內容:有一個abstract class Collider
和一些擴展該類的類,例如RectCollider
和CircleCollider
。 這些的多個實例都在同一List<Collider> colliders
。
現在,我的問題是我應該如何檢查這些對撞機之間的沖突,同時又要保持它們之間的兼容性。 例如,我要檢查RectCollider
和另一個RectCollider
之間的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));
但是,我不確定這是否真的是最快/最好的方法,因為當添加更多對撞機類型時,這種方法的使用起來會變得非常復雜。
這樣,當您添加新的子類時,方法大小將按平方縮放。 是否可以簡單地做到這一點,取決於要調用的方法(rectRect,rectCircle等)。
所有這些方法是不相關的,還是形狀相同的每種方法都具有共同的行為? 在前一種情況下,您不走運。 在后一種情況下,您可能想在Collider的子類中定義此行為,並添加提取該行為的常規方法。 然后,它的大小可以恆定,例如:
public Collision getCollision(Collider a, Collider b) {
Force f1 = a.getCollisionInfo();
Force f2 = b.getCollisionInfo();
return new Collision(f1, f2);
}
關於執行性能,沒關系。 JVM為您優化了所有功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.