Массив указателей функции в Java [дубликат]

14
задан Community 23 May 2017 в 12:34
поделиться

4 ответа

В Java нет указателя функции как такового (или "делегата" в языке C#). Подобные вещи обычно делаются с помощью анонимных подклассов.

public interface Worker {
  void work();
}

class A {
  void foo() { System.out.println("A"); }
}

class B {
  void bar() { System.out.println("B"); }
}

A a = new A();
B b = new B();

Worker[] workers = new Worker[] {
  new Worker() { public void work() { a.foo(); } },
  new Worker() { public void work() { b.bar(); } }
};

for (Worker worker : workers) {
  worker.work();
}
27
ответ дан 1 December 2019 в 06:28
поделиться

Вы можете достичь того же результата с помощью паттерна functor. Например, имея абстрактный класс:

abstract class Functor
{
  public abstract void execute();
}

Ваши "функции" будут на самом деле методом execute в производных классах. Затем вы создаете массив функторов и заполняете его соответствующими производными классами:

class DoSomething extends Functor
{
  public void execute()
  {
    System.out.println("blah blah blah");
  }
}

Functor [] myArray = new Functor[10];
myArray[5] = new DoSomething();

И затем вы можете вызвать:

myArray[5].execute();
12
ответ дан 1 December 2019 в 06:28
поделиться

Это возможно, вы можете использовать массив Method. Возьмите их с помощью Reflection API (редактирование: это не функции, поскольку они не автономны и должны быть связаны с экземпляром класса, но они подойдут - только не ожидайте чего-то вроде закрытия)

.
3
ответ дан 1 December 2019 в 06:28
поделиться

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

В противном случае вы можете использовать отражение/интроспекцию (например, класс Method), но обычно это не самый простой и естественный подход.

2
ответ дан 1 December 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: