2

我一直试图通过研究“Welcome to HotJava”小程序的代码来了解小程序。我使用 Windows 版本的Jad反编译了 *.class 文件,我看到以下代码行

public void init() {
    // Skip some lines...
    addMouseListener(this);
}

public void destroy()
{
    removeMouseListener(this);
}

这里真的需要destroy方法吗?如果小程序即将结束,为什么小程序需要将自己作为鼠标侦听器移除?

4

4 回答 4

1

如果您想留下您的小程序曾经运行过的任何“证据”,那么 destroy() 至关重要......

例如,您可以将所有状态信息发送到文件或服务器以供后续使用,或者让服务器知道您正在断开连接。

想象一下,你有一个聊天应用程序......

于 2009-02-22T01:05:33.533 回答
1

destroy()方法清理资源,以便可以释放它们。当整个 JVM 将关闭时,在关闭之前释放所有资源并不那么重要,但即使不是绝对必要,做正确的事情总是一个好主意。

根据线程模型,如果您将自己作为鼠标侦听器,那么如果发生鼠标事件,您仍然会收到通知。如果在同一个 JVM 中有多个 Applet 并且只有一个 Applet 正在结束,那么如果您留下一个不会对其采取任何操作的侦听器,那么您可以让线程处于一种有趣的状态。这样做可能会锁定其他 Applet。

编辑:

对于处于有趣状态的线程,我的意思是(例如)如果 Applet 线程已停止的侦听器正在将消息排队到没有人读取的队列中,那么最终队列将填满并且调度线程将阻塞。(更详细地说,假设侦听器只对消息进行排队,并且 Applet 中有一个线程——现在已停止——从这个队列中读取。一旦队列填满,它将阻塞!)

具体来说,使用鼠标侦听器可能是安全的,假设当 Applet 退出时它不再可见并且不能再接收鼠标事件。但是,如果使用不同类型的听众,您可能会遇到麻烦。总是做正确的事,即使它不是真正必要的,也会让你养成习惯,这样你就不会忘记在真正关键的时候做正确的事。:)

于 2009-02-22T01:17:42.460 回答
1

它在释放存在于小程序上下文之外的资源时很有用。假设您从外部服务器端应用程序中获取了资源,例如许可证。或者您可能需要通知某些服务器端资源应用程序已关闭以进行统计或其他原因。

于 2009-02-22T01:27:49.313 回答
0

好吧,不是在这种特殊情况下。但是,最好在 java 中删除鼠标(和其他)侦听器 - 不这样做可能会导致不幸的内存泄漏。

即使没有必要,destroy()清理所有所做的事情也是一个好习惯。init()

于 2009-02-22T05:05:07.530 回答