Лучший способ создать объект из строки с разделителями (надеюсь, не петельные случай)

голоса
3

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

У меня конструктор, который передал строку, которая ограничена. Из этой строки мне нужно заполнить переменный экземпляр объекта. Я могу легко разбить строку на разделителями, чтобы дать мне массив строк. Я знаю, что могу просто перебрать массив и установить свои переменные экземпляра с помощью сослагательного наклонения или переключателя / случая заявления на основе текущего индекса массива - однако, что просто чувствует себя немного противно. Псевдо-код:

String[] tokens = <from generic string tokenizer>;

for (int i = 0;i < tokens.length;i++) {
   switch(i) {
      case(0): instanceVariableA = tokens[i];
      case(1): instanceVarliableB = tokens[i];
      ...
   }
}

Кто-нибудь есть какие-либо идеи о том, как я могу сделать это лучше / красивее?

Для чего это стоит, я работаю в Java, но я предполагаю, что это язык независимо.

Задан 31/03/2009 в 14:12
источник пользователем
На других языках...                            


5 ответов

голоса
4

Ммм ... «противный» находится в пути конструктор обрабатывает параметры. Если вы не можете изменить это, то ваш фрагмент кода, как хорошо, как это может быть.

Вы можете избавиться от для цикла, хотя ...

instanceVariableA = tokens[0];
instanceVariableB = tokens[1];

а затем ввести константы (для readibilty):

instanceVariableA = tokens[VARIABLE_A_INDEX];
instanceVariableB = tokens[VARIABLE_B_INDEX];

Примечание : если вы могли бы изменить синтаксис параметров строки можно ввести простой парсер и, с немного поразмыслив, справиться с этим делом чуть более изящным способом:

String inputString = "instanceVariableA=some_stuff|instanceVariableB=some other stuff";
String[] tokens = inputString.split("|");
for (String token : tokens)
{
    String[] elements = token.split("=");
    String propertyName = tokens[0];
    String propertyValue = tokens[1];
    invokeSetter(this, propertyName, propertyValue); // TODO write method
}
Ответил 31/03/2009 в 14:18
источник пользователем

голоса
0

просто непроверенные идеи,

сохранить оригинальный маркер ...

String[] tokens = <from generic string tokenizer>;

затем создать

int instanceVariableA = 0;
int instanceVariableB = 1;

если вам нужно использовать его, то просто

tokens[instanceVariableA];

следовательно , не более петель, не более VARIABLE_A_INDEX...

может быть , JSON может помочь?

Ответил 31/03/2009 в 14:30
источник пользователем

голоса
0

Python-конкретное решение:

Скажем params = ["instanceVariableA", "instanceVariableB"]. Затем:

self.__dict__.update(dict(zip(params, tokens)))

должно сработать; что примерно эквивалентно

for k,v in zip(params, tokens):
    setAttr(self, k, v)

в зависимости от наличия / отсутствия аксессорах.

В нединамическом языке, вы могли бы добиться того же эффект строит отображение из строк в ссылки / аксессорах некоторого вида.

(Также нужно учитывать , что zipостанавливается , когда либо список заканчивается.)

Ответил 31/03/2009 в 14:28
источник пользователем

голоса
0

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

Другой метод должен был бы создать HashMap с целыми ключами и строковых значений, где ключ является индексом и значением является имя свойства. Затем вы можете использовать простой цикл и некоторые размышления, чтобы установить свойство. Отражающая часть может сделать это немного медленно, но на другом языке (например, PHP, например), это было бы намного чище.

Ответил 31/03/2009 в 14:23
источник пользователем

голоса
0

Не могли бы вы не использовать «для-каждый» цикл, чтобы устранить большую часть беспорядка?

Ответил 31/03/2009 в 14:21
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more