Java: наиболее эффективный способ вызова различных методов в зависимости от типа параметра, которые имеют один и тот же суперкласс - PullRequest
0 голосов
/ 05 февраля 2019

Примите во внимание следующее: существует abstract class Collider и еще несколько классов, расширяющих этот класс, например 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));

Однако я 'Я не уверен, действительно ли это самый быстрый / лучший подход, поскольку этот метод становится слишком сложным очень быстро, когда добавляется больше типов коллайдеров.

1 Ответ

0 голосов
/ 05 февраля 2019

Таким образом, размер вашего метода масштабируется квадратично при добавлении новых подклассов.Можете ли вы просто это сделать, зависит от методов, которые вы вызываете (rectRect, rectCircle и т.В первом случае вам не повезло.В последнем случае вы можете определить это поведение в подклассах Collider и добавить общий метод, который извлекает это поведение.Тогда он может иметь постоянный размер, например:

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

Что касается производительности выполнения, это не имеет значения.JVM оптимизирует все это для вас.

...