В настоящее время у меня есть несколько классов Java, которые реализуют интерфейс Processor
, то есть все они имеют метод processRequest(String key)
. Идея состоит в том, что у каждого класса есть несколько (скажем, <10) членов <code>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 (некоторая возвращаемая пустота), и мне нужно динамически обращаться к типу возврата (используя отражение) каждой функции в каждом классе, для которого есть ключ. У меня уже есть менеджер, который знает обо всех ключах, но не отображение ключа на функцию.
Моим первым инстинктом было заменить это отображение с помощью операторов if-else
на Map<String, Function>
, как я мог сделать в Javascript. Но Java не поддерживает первоклассные функции, поэтому мне не повезло. Я мог бы выкопать стороннюю библиотеку, которая позволяет мне работать с первоклассными функциями, но я еще не видел ни одной, и сомневаюсь, что мне нужна целая новая библиотека.
Я также думал о том, чтобы поместить эти String
ключи в массив и использовать рефлексию для вызова методов по имени, но я вижу два недостатка этого метода:
- Мои ключи должны называться так же, как метод - или именоваться определенным, согласованным образом, чтобы их было легко сопоставить с именем метода.
- Это кажется НАМНОГО медленнее, чем
if-else
заявления, которые я имею сейчас. Эффективность вызывает беспокойство, потому что эти методы будут вызываться довольно часто, и я хочу минимизировать ненужные накладные расходы.
TL; DR: Я ищу чистый, с минимальными издержками способ сопоставления String
с каким-то Function
объектом, который я могу вызвать и вызвать (что-то вроде) getReturnType()
on. Я не особо против использования сторонней библиотеки, если она действительно соответствует моим потребностям. Я также не против использования рефлексии, хотя я бы предпочел не использовать рефлексию каждый раз, когда я выполняю поиск методов - возможно, использую некоторую стратегию кэширования, которая сочетает Map
с отражением.
Мысли о хорошем способе получить то, что я хочу? Ура!