Какова самая скрытая вещь для указателя функции в java?

Возможный дубликат:
Что ближайшая замена указателя на функции в Java?

У меня просто ситуация, когда было бы неплохо иметь функциональность чего-то похожего на указатели на функции, как вы могли бы использовать в c или С++. Лучшее, что я могу придумать, это комбинировать Runnables и запускать их в другом потоке. Предложения?

Ответ 1

Пока они не добавят закрытие java, предмет кажется ближе всего к java.lang.reflect.Method. Например Method method = SomeClass.getMethod("methodName", methodParameterTypes)

Затем вы можете передать method вокруг (как указатель функции) и вызвать invoke(..) на нем, передав объект (или null, если статический)

Но это не совсем хорошая практика. Вы можете определить интерфейс или использовать существующий Runnable/Callable, реализовать его в строке и передать экземпляр.

Ответ 2

Используйте Функторы, а также Объекты функций.

Java не имеет первоклассных функций, поэтому функциональные объекты обычно выражаются с помощью интерфейса с одним методом (чаще всего Callable интерфейс), как правило, с реализация является анонимной внутренний класс.

Ответ 3

Возможно, вы ищете шаблон команды который по существу определяет интерфейс с одним методом (скажем execute()) и классы, реализующие этот метод для разных действий. Вы можете использовать ссылки на экземпляры этих классов, вроде указателей на функции в С++. Этот шаблон часто используется для реализации интерпретаторов.

Ответ 4

Один вариант использует java.lang.reflect.Method, как объясняется в ответах Божо. Это очень гибко, но главными недостатками являются то, что вы теряете всю безопасность типов - нет никакой проверки, что вы вызываете метод с правильными параметрами (и ожидаете правильный тип возврата).

Итак, если вы позже измените метод и забудьте изменить все вызывающие, вы узнаете только во время выполнения (через ClassCastException). Даже имя метода проверяется только во время выполнения (потому что вы выбираете его по имени.

Альтернативой является использование обратных вызовов через интерфейсы. Метод, который хочет принять другой метод в качестве параметра, просто ожидает экземпляр определенного интерфейса. Интерфейс имеет только один метод, doStuff. Затем вы можете создавать экземпляры, реализующие интерфейс, и передавать их методам. Это немного более подробный (потому что вам нужен интерфейс), но типичный и, следовательно, более простой для рефакторинга.

Это более или менее шаблон , BTW.

Ответ 5

Обратные вызовы - это способ реализовать что-то похожее, что вы делаете с помощью указателя на функции в С++.
Кроме того, они безопасны по типу (в отличие от указателей функций, которые могут не быть).