В настоящее время у меня есть куча классов Java, которые реализуют интерфейс Processor
, то есть все они имеют метод processRequest(String key)
. Идея состоит в том, что каждый класс имеет несколько (например, < 10) членов Strings
, и каждая из этих карт относится к методу этого класса с помощью метода processRequest
, например:
class FooProcessor implements Processor
{
String key1 = "abc";
String key2 = "def";
String key3 = "ghi";
// and so on...
String processRequest(String key)
{
String toReturn = null;
if (key1.equals(key)) toReturn = method1();
else if (key2.equals(key)) toReturn = method2();
else if (key3.equals(key)) toReturn = method3();
// and so on...
return toReturn;
}
String method1() { // do stuff }
String method2() { // do other stuff }
String method3() { // do other other stuff }
// and so on...
}
Вы получаете идею.
Это работало отлично для меня, но теперь мне нужно доступное время исполнения от ключа к функции; не каждая функция фактически возвращает String (некоторый возврат void), и мне нужно динамически обращаться к типу return (используя отражение) каждой функции в каждом классе, для которой есть ключ. У меня уже есть менеджер, который знает обо всех ключах, но не в отображении от ключа к функции.
Мой первый инстинкт заключался в замене этого сопоставления с помощью операторов if-else
с помощью Map<String, Function>
, как я мог бы сделать в Javascript. Но Java не поддерживает первоклассные функции, поэтому мне там не повезло. Возможно, я мог бы выкопать стороннюю библиотеку, которая позволяет мне работать с первоклассными функциями, но я еще не видел их, и я сомневаюсь, что мне нужна вся новая библиотека.
Я также думал о том, чтобы поместить эти ключи String
в массив и использовать отражение для вызова методов по имени, но я вижу два нижних уровня этого метода:
- Мои ключи должны быть названы так же, как и метод, или должны быть названы определенным, последовательным способом, чтобы было легко сопоставить их с именем метода.
- Это кажется ПУТЬ медленнее, чем у операторов
if-else
, которые у меня есть сейчас. Эффективность - это что-то вроде проблемы, потому что эти методы будут часто вызываться довольно часто, и я хочу минимизировать ненужные накладные расходы.
TL; DR: Я ищу чистый, минимальный накладной способ сопоставления String
с каким-либо объектом Function
, который я могу вызвать и вызвать (что-то вроде) getReturnType()
on. Я не особо возражаю против использования сторонней библиотеки, если она действительно соответствует моим потребностям. Я также не возражаю против использования рефлексии, хотя я бы предпочел не использовать рефлексию каждый раз, когда я выполняю поиск метода - возможно, используя некоторую стратегию кэширования, которая объединяет Map
с отражением.
Мысли о хорошем способе получить то, что я хочу? Ура!