为什么这个applet有一个destroy方法?

时间:2009-02-22 00:53:17

标签: java applet

我一直在尝试通过研究"Welcome to HotJava" applet的代码来了解applet。我使用Windows版Jad反编译* .class文件,我看到以下几行代码

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

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

这里真的需要破坏方法吗?为什么applet需要将其自身移除为鼠标监听器,如果它即将结束?

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

destroy()方法清理资源,以便释放它们。当整个JVM关闭时,在关闭之前释放所有资源并不是那么重要,但即使不是非常必要,也要做正确的事情。

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

编辑:

通过处于滑稽状态的线程,我的意思是(例如)如果其Applet线程已停止的侦听器将消息排队到没有人正在读取的队列,那么最终队列将填满并且调度线程将块。 (更详细地说,让我们假设侦听器除了对消息进行排队之外什么都不做,并且Applet中有一个线程 - 现在已停止 - 从该队列中读取。一旦队列填满,它将阻塞!)

使用鼠标侦听器,具体而言,您可能很安全,假设Applet退出时不再可见,并且无法再接收鼠标事件。然而,对于不同类型的倾听者,您可能会遇到麻烦。一直做正确的事情,即使不是真正必要的事情,也会让你养成习惯,这样你就不会忘记做正确的事情。 :)

答案 2 :(得分:1)

它有助于释放存在于applet上下文之外的资源。假设您已从外部服务器端应用程序(如许可证)获取资源。或者,您可能需要通知某个服务器端资源,该应用程序已关闭以获取统计信息或其他原因。

答案 3 :(得分:0)

嗯,不是在这个特定的案例中。但是,最好在java中删除鼠标(和其他)侦听器 - 不这样做会导致不幸的内存泄漏。

对于destroy() init()清除{{1}}所做的所有事情,即使没有必要,这也是一种很好的做法。