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

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

05.05.2013, 10:13. Показов 14433. Ответов 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,205
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru