Java最终匿名类vs垃圾收集器

时间:2018-12-05 23:06:23

标签: java garbage-collection final anonymous-class

我的问题是,当作为参数传递给异步回调时,我们应该如何使用匿名类? 例如,如果我有以下代码:

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
        });
}

通过分配每次新的侦听器(MyListener)来循环调用“ makeJob”, “ onResponse”,此侦听器有资格成为垃圾收集器吗? 是否需要保留对此侦听器的一种引用,以确保稍后在“ onResponse”中使用该侦听器时未将其丢弃?

1 个答案:

答案 0 :(得分:1)

当没有其他对象引用对象时,这些对象将有资格进行垃圾回收。

在您的情况下,MyListener对象被传递到makeJob,然后由CallbackInterface对象引用。请注意,引用不必是在CallbackInterface中明确声明的成员变量(实际上,Java运行时会生成一个并复制引用)。

只要CallbackInterface对象存在,其关联的MyListener就不会被垃圾回收。这意味着只要doAsyncJob在作业运行期间一直保持对CallbackInterface的引用,那么MyListener将始终可用。