С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/76: Рейтинг темы: голосов - 76, средняя оценка - 4.99
5 / 5 / 2
Регистрация: 12.11.2011
Сообщений: 70

CallBack -Обратный вызов

05.05.2013, 10:13. Показов 14340. Ответов 5

Студворк — интернет-сервис помощи студентам
Не могу вкурить обратные вызовы в Java. По Вики - это передача исполняемого кода в качестве одного из параметров другого кода. Обратный вызов позволяет в функции исполнять код, который задаётся в аргументах при её вызове.
В Java этот механизм можно реализовать, например, с помощью интерфейсов.
Вот как я это понимаю:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface X{
  void hello();
}
 
class A implements X{
  public void hello(){System.out.println("Hello");}
}
 
class Caller{
  static void callBack(X x){x.hello();}
}
 
class test{
  public static void main(String[] args){
    A a = new A();
    Caller.callBack(a);
  }
}
Правильно ли я понял?
Спасибо за ответ.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.05.2013, 10:13
Ответы с готовыми решениями:

Обратный вызов. javax.swing.Timer
http://pro-java.ru/java-dlya-nachinayushhix/interfejsy-i-obratnyj-vyzov/ ActionListener listener = new TimePrinter(); Timer t = new...

Подскажите книгу где бы разъяснялось про работу CallBack (Обратный вызов) функций
Здравствуйте. Подскажите пожалуйста книгу где бы разъяснялось про работу CallBack (Обратный вызов) функций.

Обратный вызов из DLL (CALLBACK)
В справке описано, что CALLBACK ф-я должна иметь такой вид: typedef struct { UINT16 Year; UINT16 Month; UINT16 Day; UINT16...

5
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
05.05.2013, 13:15
Так работает же, значит, правильно пишешь.
Не знаю как в Java, а много где именно x называют колбэком, потому что именно он устанавливает обратную связь, являясь мостом между Caller и соответствующей имплементацией X. У Caller метод может быть не только static.
Кстати, можно использують эту для отложных вызовов. Например:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface X{
  void hello();
}
 
class A implements X{
  public void hello(){System.out.println("Hello");}
}
 
class Caller{
  private X x;
  public Caller(X x){this.x=x;} // сохраняем
  void call(){this.x.hello();} // вызываем
}
 
class test{
  public static void main(String[] args){
    A a = new A();
    Caller caller = new Caller(a); // обратная связь установлена
    // ...
    caller.call(); // обратная связь в действии
  }
}
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
05.05.2013, 14:12
не ребята чуть нетак
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.util.ArrayList;
import java.util.Random;
 
/**
 *
 * @author mutagen
 */
public class CallBackDemo {
 
    public static void main(String[] args) {
 
        Caller caller = new Caller();
 
        for (int i = 0; i < 10; i++) {
            new Worker(caller).start();
        }
//        итого у нас 9 воркеров отработали и вернули ответ по калбеку в коллекцию
        System.out.println(caller.getStatuses());
    }
 
    static class Caller implements Callback {
 
        private ArrayList<Integer> statuses = new ArrayList<>();
 
        public ArrayList<Integer> getStatuses() {
            return statuses;
        }
 
        @Override
        public void callMeBack(int status) {
//            тут может быть логика куда вернутся данные, может быть коллекция, я выбрал попроще
            synchronized (statuses) {
                statuses.add(status);
            }
        }
    }
 
    static interface Callback {
//        подготовим интерфейс по которому нам будут возвращать данные
 
        void callMeBack(int status);
    }
 
    static class Worker extends Thread {
 
        private Callback cb;
 
        public Worker(Callback cb) {
            this.cb = cb;
        }
 
        int pleaseDoMeAFavor() {
            return new Random().nextInt();
        }
 
        @Override
        public void run() {
//            выполним работу 
            int st = pleaseDoMeAFavor();
//            и вернём данные вызывающему по калбек интерфейсу
            cb.callMeBack(st);
        }
    }
}
4
5 / 5 / 2
Регистрация: 12.11.2011
Сообщений: 70
05.05.2013, 22:38  [ТС]
в чем разница? Поясните, пожалуйста, mutagen
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
05.05.2013, 23:11
Цитата Сообщение от Dmitry Andreev Посмотреть сообщение
в чем разница? Поясните, пожалуйста, mutagen
в вашем варианте работа выполняется в майн и ничего не возвращается калбеком.
у вас получается какбы каскад, вы вызвали один метод а он второй из X, это не калбек.

калбек в чистом виде, это когда вы сформировали задачу и отправили её выполнять какому то там процессу,
но не ждёте её завершения и продолжаете работать, а чтобы к вам мог вернутся результат работы,
вы для воркера передаёте ссылку на свой класс с кастом в интерфейс калбека в котором обьявлен метод
при помощи которого воркер может вернуть данные. Вся работа происходит асинхронно без блокировок и ожиданий.
В этом смысл калбеков, так как некоторые задачи могут идти долго, а некоторые быстро, но каллер не должен об этом
заботиться, он просто предоставляет интерфейс для ответа и продолжает работу
1
5 / 5 / 2
Регистрация: 12.11.2011
Сообщений: 70
07.05.2013, 12:54  [ТС]
Спасибо mutagen за разъяснения. Меня смутил пример из книги Thinking in Java 4 Bruce Eckel:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//: innerclasses/Callbacks.java
// Using inner classes for callbacks
package innerclasses;
import static net.mindview.util.Print.*;
 
interface Incrementable {
  void increment();
}
 
// Very simple to just implement the interface:
class Callee1 implements Incrementable {
  private int i = 0;
  public void increment() {
    i++;
    print(i);
  }
}   
 
class MyIncrement {
  public void increment() { print("Other operation"); }
  static void f(MyIncrement mi) { mi.increment(); }
}   
 
// If your class must implement increment() in
// some other way, you must use an inner class:
class Callee2 extends MyIncrement {
  private int i = 0;
  public void increment() {
    super.increment();
    i++;
    print(i);
  }
  private class Closure implements Incrementable {
    public void increment() {
      // Specify outer-class method, otherwise
      // you'd get an infinite recursion:
      Callee2.this.increment();
    }
  }
  Incrementable getCallbackReference() {
    return new Closure();
  }
}   
 
class Caller {
  private Incrementable callbackReference;
  Caller(Incrementable cbh) { callbackReference = cbh; }
  void go() { callbackReference.increment(); }
}
 
public class Callbacks {
  public static void main(String[] args) {
    Callee1 c1 = new Callee1();
    Callee2 c2 = new Callee2();
    MyIncrement.f(c2);
    Caller caller1 = new Caller(c1);
    Caller caller2 = new Caller(c2.getCallbackReference());
    caller1.go();
    caller1.go();
    caller2.go();
    caller2.go();
  } 
}/* Output:
Other operation
1
1
2
Other operation
2
Other operation
3
*///:~
Я так понимаю автор здесь хотел показать использование внутренних классов для обратного вызова. Используя интерфейс Incrementable класс Callee2 возрвращает результат - экземпляр внутреннего класса Closure.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.05.2013, 12:54
Помогаю со студенческими работами здесь

Вызов callback после WM_CREATE
есть такой callback LRESULT CALLBACK newTest(int nCode, WPARAM wParam, LPARAM lParam) Как мне его вызвать?Помогите)Вопрос легкий но...

Асинхронный вызов: Abort и Callback
Всем привет! Недавно начал разбираться с многопоточностью в .NET. 1) Мне нужно запустить поток так, чтобы после его завершения ...

Вызов callback для захвата фото с web cam
Народ, спасайте! Подскажите, из-за чего вылетает такая ошибка при установке простой функции обратного вызова для обработки изображения с...

Обратный вызов клиента
Может кто доступно объяснить принцип действия обратного вызова клиента и метода ClientScript.GetPostBackEventReference. На МСДН просьба...

Существует ли обратный вызов в событиях?
Пожалуйста помогите. Добавлено через 17 минут &lt;Window x:Class=&quot;WpfApplication1.MainWindow&quot; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru