Функции обратного вызова довольно просты в Java. Способ сделать это - просто определить некоторый интерфейс A, который имеет единственный метод m(), а затем добавить коллекцию типа A в ваш класс World. Затем, в какой-то момент вашего объекта World вы хотите перебрать свою коллекцию A и вызвать метод m() для каждого элемента. Чтобы добавить в свой мир «функции обратного вызова», вы просто определяете некоторый класс, который реализует ваш интерфейс A и помещает его в коллекцию объектов A вашего класса World. Например,
public interface CallbackFunction
{
public void execute(int a, int b);
}
public class World
{
List<CallbackFunction> callbackFunctions;
public void addCallback(CallbackFunction f)
{
callbackFunctions.add(f);
}
private void updateWorld()
{
// This loop could be anywhere in your World class
for(CallbackFunction f : callbackFunctions)
{
f.execute(<some int>, <some int>);
}
}
}
Затем добавить функцию в свой мир:
world.addCallback(new CallbackFunction()
{
public void execute(int a, int b)
{
// Do some stuff
}
}
Я оставляю остальное до вас, но это должно дать вам хорошее представление о том, как обратные вызовы обычно реализуются в Java ,
Вам также не нужно хранить общую коллекцию функций обратного вызова, у вас могут быть специальные функции обратного вызова в сочетании с определенными методами в вашем классе World. Например, ваш класс World может иметь некоторый метод, который сортирует вещи, сравнивая два элемента в коллекции. Чтобы определить, должен ли идти один объект до или после другого, вы можете определить интерфейс CallbackFunction, у которого есть метод, который принимает 2 вещи (например, int) и возвращает значение, указывающее, какая вещь должна идти первой. Например,
public interface CallbackForSorting
{
public int compare(int a, int b);
}
public class World
{
List<Integer> thingsToSort;
public void sortThings(CallbackForSorter sorter)
{
int result = sorter.compare(thingsToSort.get(i), thingsToSort.get(i+1));
if(result == 0) // elements are equal
if(result == -1) // thingsToSort.get(i) is "less than" thingsToSort.get(i+1)
if(result == 1) // thingsToSort.get(i) is "greater than" thingsToSort.get(i+1)
}
}
Отличный ответ, thx – jax