Нуждаюсь в помощи с обратными вызовами и анонимными классами в Java

std::transform(myv1.begin(), myv1.end(), myv1.begin(), 
   [](double d) -> double { return d * 3; });
6
задан serg 28 May 2009 в 01:08
поделиться

2 ответа

Если я правильно понимаю ваш вопрос, вы спрашиваете, как вы можете написать переменную изнутри анонимного класса.

Анонимные классы могут получить доступ только к конечным переменным и могут ' t напрямую "записывать" их.

Простое решение, которое "достаточно хорошо", - это создать своего рода класс ValueBox с одним полем значения и геттером и сеттером. Затем вы можете создать новый экземпляр в функции как конечную переменную и получить к ней доступ анонимному классу. Анонимный класс будет использовать свои методы получения и установки для записи / чтения.

Тот факт, что переменная является final, означает, что вы не можете направить ссылку куда-либо еще, но вы все равно можете изменить содержимое указанного объекта из любого функция.

Более серьезная проблема, с которой вы столкнетесь, - это ожидание вызова обратного вызова. Такой вид ожидания-сна может быть достаточно хорошим, но вы можете рассмотреть таймауты, потоки и т. Д., В зависимости от того, чего вы пытаетесь достичь.

Кроме того, все это предполагает, что вы никогда не собираетесь называть это дважды по подключению. В противном случае вам необходимо предоставить нам дополнительную информацию о вашей модели синхронизации.

Вот пример кода:

public int getUserid(String username) {
        final ValueBox<Integer> userid = new ValueBox<Integer>();

        connection.call("getUserid", new Responder() {
                public void onResult(final int result) {
                        System.out.println("userid: " + result);
                        userId.setValue(result);
                        //how to assign received value to userid and return it?
                }
        }, username);

        //wait for response
        while (userid.isEmpty()) {
                try{
                        Thread.sleep(100);
                } catch (Exception e) {}
        }

      return userid.getValue();
}
2
ответ дан 17 December 2019 в 20:34
поделиться

Самым простым изменением является использование чего-то вроде java. util.concurrent.SynchronousQueue . Но, возможно, вы захотите самостоятельно создать интерфейс, управляемый событиями.

0
ответ дан 17 December 2019 в 20:34
поделиться
Другие вопросы по тегам:

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