Динамическая генерация массивов - PullRequest
0 голосов
/ 31 марта 2011

Мне нужно сгенерировать мой массив в соответствии с командами, собранными от пользователя.
Например

если пользователь вводит " первый тип массива" мой массив будет

processors = new Processor[] {new object_a(),object_b(2,3),object_c()};

иначе, если пользователь введет « second type of array» мой массив будет

processors = new Processor[] {new object_e(),object_f(3),object_g("fdf")};

Я не хочу писать большую структуру if-else.

Как я могу динамически генерировать мой массив в соответствии с файлом конфигурации и пользовательским вводом?

Ответы [ 3 ]

1 голос
/ 31 марта 2011

Вы можете использовать карту:

//Build Data-Map
Map<String, Processor[]> processorTypes = new HashMap<String, Processor[]>();
processorTypes.put("first", new Processor[] {new object_a(),object_b(2,3),object_c()});
processorTypes.put("second", new Processor[] {new object_e(),object_f(3),object_g("fdf")});

//Get setup
String userAnswer = getByUser();
Processor[] processors = processorTypes.get(userAnswer);
0 голосов
/ 31 марта 2011

Предполагая, что у вас есть файл конфигурации в виде некоторого XML (или любого другого формата), и задайте имя для каждой настройки и элементы массива с их свойствами:

<processor-config name="first">
    <object type="a"/>
    <object type="b">
        <argument value="2">
        <argument value="3">
    </object>
    <object type="c"/>
</processor-config>

Иметь класс ProcessorConfig в javaкоторый содержит все эти данные и который предоставляет метод, подобный следующему:

public Processor[] createProcessors() {
    Processor[] processors = new Processor[objectList.size()];
    for (int i = 0; i < objectList.size(); i++) {
        processors[i] = objectList.get(i).createProcessor();
    }
}

* * * * * * * * * * * * * * * * Здесь список ObjectWrapper содержит список *1009* бинов, содержащих данные для конфигурации объекта (соответствует XML object element): тип и аргументы, и он также знает, как создать процессор на основе его состояния.

Получив его, вы можете проанализировать файл XML и сохранить карту String -> * 1014.* поэтому, основываясь на пользовательском вводе, вы можете просто написать:

configMap.get(userInputString).createProcessors()

Конечно, вы должны проверять на нулевое значение и не вызывать методы, как описано выше, но я хотел, чтобы это было как можно короче.

РЕДАКТИРОВАТЬ: было бы намного проще, если бы вы могли использовать контейнер Spring IoC в своем проекте и просто определить эти ProcessorConfig экземпляры как бины непосредственно на карте, не анализируя XML самостоятельно.

0 голосов
/ 31 марта 2011

Я не думаю, что выражение if было бы слишком плохим в этом сценарии.Вы можете использовать троичный оператор:

processors = userChoice
        ? new Processor[] { new object_a(), object_b(2,3), object_c() }
        : new Processor[] { new object_e(), object_f(3),   object_g("fdf") };

Или, если вы хотите более детальный контроль, вы можете сделать

Processor[] chosenProcessors = (new ArrayList<Processor>() {{

    if (option1) add(new object_a());
    ...
    if (optionN) add(new object_N());

}}).toArray(new Processor[0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...