2

「WelcometoHotJava」アプレットのコードを調べて、アプレットについて学ぼうとしています。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

アプレットのコンテキスト外に存在するリソースを解放するのに役立ちます。ライセンスなど、外国のサーバー側アプリケーションからリソースを取得したとします。または、アプリケーションが統計またはその他の理由でシャットダウンしたことをサーバー側のリソースに通知する必要がある場合もあります。

于 2009-02-22T01:27:49.313 に答える
1

このdestroy()メソッドは、解放できるようにリソースをクリーンアップします。JVM全体がシャットダウンする場合、シャットダウンする前にすべてのリソースを解放することはそれほど重要ではありませんが、厳密に必要でない場合でも、正しいことを実行することは常に良い考えです.

スレッド モデルによっては、自分自身をマウス リスナーのままにしておくと、マウス イベントが発生した場合に引き続き通知されます。同じ JVM に複数のアプレットがあり、終了するアプレットが 1 つだけの場合、アクションが実行されないリスナーを離れると、スレッドがおかしい状態のままになる可能性があります。そうすることで、他のアプレットをロックできる可能性があります。

編集:

面白い状態のスレッドとは、(たとえば) アプレット スレッドが停止したリスナーが、誰も読み取っていないキューにメッセージをキューイングしている場合、最終的にキューがいっぱいになり、ディスパッチ スレッドがブロックされることを意味します。(より詳細には、リスナーがメッセージをキューに入れるだけで、このキューから読み取るスレッドがアプレットにあり、現在は停止していると仮定します。キューがいっぱいになると、それはブロックされます!)

具体的には、マウス リスナを使用すると、アプレットが終了すると表示されなくなり、マウス イベントを受け取ることができなくなると仮定すると、安全になる可能性があります。ただし、別の種類のリスナーを使用すると、問題が発生する可能性があります。本当に必要でない場合でも、常に正しいことを行うことで、実際に重要なときに正しいことを行うことを忘れないようにする習慣が身につきます。:)

于 2009-02-22T01:17:42.460 に答える
0

まあ、この特定の場合ではありません。ただし、Javaでマウス(およびその他の)リスナーを削除することをお勧めします。削除しないと、不幸なメモリリークが発生する可能性があります。

また、不要な場合でも、実行destroy()するすべてのものをクリーンアップすることをお勧めします。init()

于 2009-02-22T05:05:07.530 に答える