Java окончательный анонимный класс против сборщика мусора - PullRequest
0 голосов
/ 06 декабря 2018

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

interface MyListener {
    void onSucces(String requestedAction, JSONObject response);
    void onError(String requestedAction, JSONObject response, int statusCode);
};

interface CallbackInterface {
    void onResponse(String requestedAction, JSONObject response, int statusCode);
};

void doAsyncJob(String action, CallbackInterface callbackItf); 


void makeJob(String action, final MyListener listener) {
    doAsyncJob(action, new CallbackInterface {
        void onResponse(String requestedAction, JSONObject response, int statusCode) {
            if (statusCode == 200) {
                listener.onSucces(requestedAction, response);
            } else {
                listener.onError(requestedAction, response, statusCose);
            }
        }
    });
}


for(i = 1; i < 1000; i++) {
    makeJob("Action_" + i, new MyListener{
        void onSucces(String requestedAction, JSONObject response) {
            //process response
        }
        void onError(String requestedAction, JSONObject response, int statusCode) {
            //process error
        });
}

, вызывающий «makeJob» в цикле путем выделения каждый раз нового слушателя (MyListener), который позже используется «onResponse», этот слушатель может получить право науборщик мусора ?Нужно ли сохранять одну ссылку на этот слушатель, чтобы быть уверенным, что при последующем использовании в onResponse он еще не надет?

1 Ответ

0 голосов
/ 06 декабря 2018

Объекты становятся пригодными для сборки мусора, когда другие объекты не ссылаются на них.

В вашем случае объекты MyListener передаются в makeJob, где на них затем ссылаются объекты CallbackInterface.Обратите внимание, что ссылка не обязательно должна быть переменной-членом, явно объявленной в CallbackInterface (на самом деле среда выполнения Java генерирует ее и копирует ссылку).

Так что, пока существует объект CallbackInterface, егосвязанный MyListener не будет собирать мусор.Это означает, что до тех пор, пока doAsyncJob хранит ссылку на CallbackInterface до тех пор, пока задание выполняется, MyListener всегда будет доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...