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

Я хотел бы сэкономить часть работы над своим приложением. Можно ли получить строку, например «level1», а затем использовать соответствующую функцию, которая будет level1 () ;? Моя основная идея - не делать огромного оператора switch-case, а делать только несколько функций уровня в классе хранилища, и всякий раз, когда вы повышаете уровень, строка будет меняться на "level" + number, где number - это int, поэтому давайте скажите, что сейчас вы находитесь на уровне 10, функция, которая будет запущена, - level10 ();

Надеюсь, я ясно объяснил ... извините, если нет ... надеюсь, вы уловили идею!

Спасибо!


person Baruch    schedule 31.07.2012    source источник
comment
Вы надеетесь, что вы четко объяснили, но это не так.   -  person Nandkumar Tekale    schedule 31.07.2012
comment
Так реализованы ли функции от level1 () до level100 ()?   -  person yhyrcanus    schedule 31.07.2012
comment
Не думаю, что у вас получится сделать это без использования рефлексии. Черт возьми, я не уверен, что ты тоже сможешь сделать это с отражением. www2.sys-con.com/itsg/ virtualcd / java / archives / 0305 / sagar2 /   -  person Shark    schedule 31.07.2012
comment
@Shark это можно сделать с отражением и без него.   -  person Matt Ball    schedule 31.07.2012
comment
Я больше не рискнул бы размышлять, если бы не необходимое мышление, поэтому я бы нашел лучший способ спроектировать и организовать свой код ... ваш ответ ниже.   -  person Shark    schedule 31.07.2012


Ответы (4)


Это действительно звучит так, как будто вам просто нужно иметь

void setLevel(int level)

вызов. Вы можете свободно игнорировать (скажем) уровни 11-14 или что-то еще ... но было бы очень некрасиво иметь отдельные методы и вызывать их по имени. Вы можете сделать это с помощью рефлексии, но сначала вам следует подумать о других вариантах.

person Jon Skeet    schedule 31.07.2012
comment
Я знаю, что это может выглядеть немного некрасиво, но проблема с вашим предложением заключается в том, что я, вероятно, получу огромный оператор Switch-Case / огромный оператор IF-ELSE, которого я пытаюсь избежать .. В любом случае спасибо - person Baruch; 31.07.2012
comment
@Baruch: Я считаю, что это все равно будет чище, чем вызов методов с помощью отражения. Вы всегда можете разбить значительные фрагменты кода на отдельные методы, вызываемые пользователем setLevel. - person Jon Skeet; 31.07.2012

Я считаю, что вы хотите вызвать метод во время выполнения, используя его имя в виде строки.

Вы можете сделать это через отражение.

Class.getMethod(String methodName, Class... parameterTypes)

person Benito Bertoli    schedule 31.07.2012

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

Если вам действительно нужно преобразовать строки в вызовы методов - и это большое «если» - создайте Map<String, Foo>, где Foo реализует какой-то "вызываемый" -подобный интерфейс. Тогда поиск от строки к методу просто:

Map<String, Foo> commands = /* ... */;
Foo foo = commands.get("level42");
foo.bar();
person Matt Ball    schedule 31.07.2012
comment
Ваш ответ кажется интересным, не могли бы вы подробнее рассказать, как его правильно использовать? может быть, у вас есть учебник по этому поводу? Спасибо! - person Baruch; 31.07.2012
comment
Ответы здесь в значительной степени описывают это: stackoverflow.com/questions/2745796/ - person Matt Ball; 31.07.2012
comment
Я боюсь, что это замедлит мое приложение, поскольку оно должно вызывать себя снова и снова бесчисленное количество раз в моем игровом цикле, мне нужно, чтобы он каждый раз перерисовывал уровень, я думаю, я вернусь, чтобы переключить регистр и функция. В любом случае спасибо - person Baruch; 31.07.2012
comment
Карта обеспечивает постоянный поиск по времени. Если это слишком медленно (например, константа слишком велика), вы можете использовать Foo[] (массив) вместо Map<String, Foo>, но тогда вы застрянете с числовыми индексами. - person Matt Ball; 31.07.2012

Пожалуйста, посмотрите верхний ответ на этот пост:

Вызов динамических функций Java

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

person LJ2    schedule 31.07.2012