Я пытаюсь создать очень простую библиотеку командной строки для интерактивных программ на Java. Вы запускаете программу Java, и она запрашивает у вас команды. Синтаксис:
> action [object_1, [object_2, [... object_n] ... ]]
например:
> addUser name "John Doe" age 42
Здесь action = "addUser", object_1 = "name", object_2 = "John Doe", object_3 = "age", object_4 = "42"
.
Все, что после action является object (то есть действие использует объекты). Вы можете видеть, что действие и объект являются простыми строками. Строки объекта также могут быть преобразованы в числа при необходимости.
Мой план состоит в том, чтобы пользователь этой библиотеки командной строки просто создавал методы (принадлежащие любому подходящему объекту Java) и назначал каждый метод определенному действию. Объекты в командной строке становятся параметрами для метода, назначаемого пользователем. Подходящим классом, который реализует метод для приведенного выше примера, будет:
class Foo {
public void addUserHandler(
String param1, String param2, String param3, Integer param4) {
do.someThing();
}
}
Когда пользователь вводит команду, соответствующая функция, назначенная программистом, вызывается с параметрами, указанными в командной строке.
Я знаю, что в Java нет указателей на функции (например, C) или делегатов (например, C #), и способ реализации обратных вызовов - через интерфейс, однако я не вижу, как я могу использовать интерфейсы в этом сценарии. Проблема, которую я вижу с интерфейсами, заключается в том, что они имеют:
- Фиксированное количество функций, которые будут реализованы
- Реализуемые функции имеют фиксированное объявление.
Проблема с (1) состоит в том, что пользователь моей библиотеки может решить реализовать любое количество функций для столько действий, сколько он хочет поддерживать. Проблема с (2) состоит в том, что пользователь захочет назначить функции с описательными именами, например addUserHandler () для действия «addUSer».
Если бы в Java были делегаты или указатели на функции, я бы просто создал карту между строками (представляющими действия) и делегатами (для фактической реализации действия в программе). Я думаю, что могу эмулировать делегатов с помощью Reflection, но это ужасно, и я теряю безопасность типов, поскольку мне пришлось бы использовать имена String для классов и методов. Есть ли лучший способ?
Спасибо