Это может быть что-то обычное и тривиальное, но мне кажется, что мне трудно найти конкретный ответ. В C # существует концепция делегатов, которая тесно связана с идеей указателей на функции из C ++. Есть ли подобная функциональность в Java? Учитывая, что указатели в некоторой степени отсутствуют, что лучше для этого? И чтобы быть ясным, мы говорим здесь первым классом.
java
pointers
delegates
function-pointers
dreadwail
источник
источник
this::myMethod
семантически то же самое, что создание лямбдыparamA, paramB -> this.myMethod(paramA, paramB)
.Ответы:
Идиома Java для функциональности, аналогичной указателю на функцию, является анонимным классом, реализующим интерфейс, например
Обновление: вышеупомянутое необходимо в версиях Java до Java 8. Теперь у нас есть намного более хорошие альтернативы, а именно лямбды:
и ссылки на методы:
источник
std::bind
, который привязывает параметры к функциям и возвращает вызываемый объект. Я не могу защитить C по этим причинам, но C ++ действительно является лучше , чем Java для этого.Вы можете заменить указатель на функцию интерфейсом. Допустим, вы хотите просмотреть коллекцию и что-то сделать с каждым элементом.
Это интерфейс, который мы могли бы передать, скажем, CollectionUtils2.doFunc (Коллекция c, IFunction f).
В качестве примера, скажем, у нас есть коллекция чисел, и вы хотели бы добавить 1 к каждому элементу.
источник
Вы можете использовать отражение, чтобы сделать это.
Передайте в качестве параметра объект и имя метода (в виде строки), а затем вызовите метод. Например:
И затем используйте это как в:
Конечно, проверьте все исключения и добавьте необходимые приведения.
источник
Нет, функции не являются объектами первого класса в Java. Вы можете сделать то же самое, реализовав класс-обработчик - так реализованы обратные вызовы в Swing и т. Д.
Однако в будущих версиях java есть предложения по закрытию (официальное название того, о чем вы говорите) - у Javaworld есть интересная статья.
источник
Это напоминает Казнь Стива Йегге в Королевстве Существительных . В основном это говорит о том, что Java нуждается в объекте для каждого действия, и поэтому не имеет «только глагольных» сущностей, таких как указатели на функции.
источник
Для достижения аналогичной функциональности вы можете использовать анонимные внутренние классы.
Если вы должны были определить интерфейс
Foo
:Создайте метод,
bar
который получит «указатель на функцию» в качестве аргумента:Наконец, вызовите метод следующим образом:
источник
Java8 представила лямбды и ссылки на методы . Поэтому, если ваша функция соответствует функциональному интерфейсу (вы можете создать свой собственный), вы можете использовать ссылку на метод в этом случае.
Java предоставляет набор общих функциональных интерфейсов . тогда как вы могли бы сделать следующее:
источник
alias
: например,public List<T> collect(T t) = Collections::collect
В Java такого нет. Вам нужно будет обернуть вашу функцию в некоторый объект и передать ссылку на этот объект, чтобы передать ссылку на метод этого объекта.
Синтаксически это может быть в определенной степени облегчено с помощью анонимных классов, определенных на месте, или анонимных классов, определенных как переменные-члены класса.
Пример:
источник
Я реализовал поддержку обратного вызова / делегата в Java, используя отражение. Подробности и рабочий источник доступны на моем сайте .
Как это устроено
У нас есть основной класс с именем Callback с вложенным классом с именем WithParms. API, которому требуется обратный вызов, примет объект Callback в качестве параметра и, если необходимо, создаст Callback.WithParms в качестве переменной метода. Поскольку многие из приложений этого объекта будут рекурсивными, это работает очень чисто.
Поскольку производительность по-прежнему остается для меня высоким приоритетом, я не хотел, чтобы мне требовалось создавать одноразовый массив объектов для хранения параметров для каждого вызова - в конце концов, в большой структуре данных могут быть тысячи элементов и обработка сообщений В этом сценарии мы можем обработать тысячи структур данных в секунду.
Чтобы быть потокобезопасным, массив параметров должен существовать уникально для каждого вызова метода API, и для эффективности тот же самый должен использоваться для каждого вызова обратного вызова; Мне нужен был второй объект, который было бы дешево создать, чтобы связать обратный вызов с массивом параметров для вызова. Но в некоторых сценариях вызывающий уже имеет массив параметров по другим причинам. По этим двум причинам массив параметров не принадлежит объекту Callback. Кроме того, выбор вызова (передача параметров в виде массива или отдельных объектов) принадлежит API, использующему обратный вызов, позволяющий использовать любой вызов, который лучше всего подходит для его внутренней работы.
Тогда вложенный класс WithParms является необязательным и служит двум целям: он содержит массив объектов параметров, необходимый для вызовов обратного вызова, и предоставляет 10 перегруженных методов invoke () (с числом параметров от 1 до 10), которые загружают массив параметров, а затем вызвать цель обратного вызова.
источник
Проверьте замыкания, как они были реализованы в библиотеке lambdaj. Они на самом деле ведут себя очень похоже на делегаты C #:
http://code.google.com/p/lambdaj/wiki/Closures
источник
По сравнению с большинством людей здесь я новичок в Java, но так как я не видел подобное предложение, у меня есть другая альтернатива, чтобы предложить. Я не уверен, что это хорошая практика или нет, или даже предлагал раньше, и я просто не понял. Мне просто нравится это, так как я думаю, что это самоописательно.
затем в зависимости от приложения назначьте
и т.п.
и позвонить по
источник