Разделение данных по типу без условных конструкций

Рейтинг: 2Ответов: 1Опубликовано: 01.04.2011

Привет сообществу.

Возможно ли (и если да, то стоит ли) обойтись без условных конструкций, если нужно задействовать различные алгоритмы для разных типов входных данных?

Например, есть таблица с данными (можно пройтись по ячейкам) и есть массив значений соответствующей размерности, которые в этой таблице должны быть. Каждое из значений может быть одного из нескольких типов (предположим, String или Image) и должно по-своему сверяться с ячейкой. Можно ли организовать проверку так, чтобы избежать (не перенести, а вообще не использовать) конструкций типа

if (expected instanceof String) {...}

Как я понимаю, если это возможно, то с помощью обобщений, но не могу сообразить как.

UPD. Значения для проверки хранятся в переменных одного типа - Object, так как передаются через единую структуру (например, так: Object[] expectedValues). Поэтому не выходит положиться на проверку типов при компиляции.

Ответы

▲ 3Принят

Попахивает паттерном Стратегия. Разделите объекты по типам и назначьте для каждого типа свою стратегию.

Например, что-то наподобие такого

abstract class MyObject {
    Types getType();
}

interface ProcessingStrategy {
    void process(MyObject object);
}

enum Types {
    IMAGE(MY_IMAGE_STRATEGY),
    TEXT(MY_TEXT_STRATEGY),
    CUSTOM(CUSTOM_STRATEGY);

    private final ProcessingStrategy strategy;
    private Types(ProcessingStrategy strategy) {
        this.strategy = strategy;
    }

    public ProcessingStrategy getStrategy() {
         return strategy;
    }
}

//......
List<MyObject> objs = ....
for (MyObject obj : objs) 
    obj.getType().getStrategy().process(obj);

PS: а как вы думаете Generics использовать для этого? Я не представляю себе такое. Generics работают только на этапе компиляции + проверки в рантайме. Так что то что вы хотите будет нельзя сделать