簡體   English   中英

Java:根據參數類型調用所有相同的超類的最有效方法

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

請考慮以下內容:有一個abstract class Collider和一些擴展該類的類,例如RectColliderCircleCollider 這些的多個實例都在同一List<Collider> colliders

現在,我的問題是我應該如何檢查這些對撞機之間的沖突,同時又要保持它們之間的兼容性。 例如,我要檢查RectCollider和另一個RectCollider之間的RectColliderRectCollider檢查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));

但是,我不確定這是否真的是最快/最好的方法,因為當添加更多對撞機類型時,這種方法的使用起來會變得非常復雜。

這樣,當您添加新的子類時,方法大小將按平方縮放。 是否可以簡單地做到這一點,取決於要調用的方法(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM