Почему у этого апплета есть метод уничтожения?


2

Я пытался узнать об апплетах, изучив код для апплета "Welcome to HotJava". Я декомпилировал * .class файл, используя версию Windows, из Jad, и я вижу следующие строки кода

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

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

ли способ уничтожить действительно нужно здесь? Почему аплет должен удалить себя в качестве слушателя мыши, если он вот-вот закончится?

1

Метод destroy() очищает ресурсы, чтобы они могли быть освобождены. Когда весь JVM будет закрыт, не стоит критиковать все ресурсы перед закрытием, но всегда полезно делать «Правильную вещь», даже если это не является абсолютно необходимым.

В зависимости от модели резьбы, если вы оставите себя слушателем мыши, вы все равно будете уведомлены о появлении событий мыши. Если в одной JVM есть несколько апплетов, и только один апплет заканчивается, вы можете оставить потоки в смешном состоянии, если вы оставите прослушиватель, на который не будет предпринято никаких действий. Возможно, вы можете заблокировать другие апплеты, сделав это.

РЕДАКТИРОВАТЬ:

нитей в смешном состоянии, я имею в виду (например), если слушатель которого Апплет поток остановлен в очереди сообщений в очередь, что никто не читает с, то в конечном итоге очередь будет заполните и поток отправки будет заблокирован. (Более подробно предположим, что прослушиватель ничего не делает, кроме очереди сообщения, и что в Applet - потоке, который теперь читается из этой очереди, есть поток. Теперь, когда очередь заполняется, он будет блокироваться!)

С прослушивателем мыши, в частности, вы можете быть в безопасности, предполагая, что когда апплет уйдет, он больше не виден и больше не может принимать события мыши. Однако с другим видом слушателя вы можете столкнуться с проблемами. Всегда поступать правильно, даже если это действительно не обязательно, вы получаете привычку, поэтому не забывайте поступать правильно, когда это действительно важно. :)

  0

Этот ответ очень близок к тому, что я искал. В нем упоминается то, что я не знал: может быть> 1 апплет/JVM, а не очистка может повлиять на других.Но мне все еще интересно, как потоки могут закончиться «в смешном состоянии», b/c. Я не вижу, как могут случиться какие-то события мыши. 22 фев. 092009-02-22 01:50:11

  0

Просто расширил мой ответ в ответ на вопросы в вашем комментарии. 22 фев. 092009-02-22 02:09:47


1

разрушающего() имеет решающее значение, если вы хотите оставить какое-либо «доказательство», что ваш апплет никогда не запускать ...

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

Представьте, что у вас есть чат приложение ...

  0

Я думаю, что использовал вводящий в заблуждение заголовок. Я могу понять, почему вам нужен этот метод (т. Е. Для очистки), но я больше спрашивал об этом конкретном случае. 22 фев. 092009-02-22 01:36:28


1

Его полезно при выпуске ресурсов, которые существуют вне контекста апплета. Допустим, вы приобрели ресурс из стороннего приложения на стороне сервера, например, лицензии. Или, возможно, вам нужно уведомить какой-либо серверный ресурс, который приложение закрыло для статистики или по какой-либо другой причине.

  0

Смотрите мой комментарий к Uri. 22 фев. 092009-02-22 01:37:41


0

Ну, не в этом частности кейс. Тем не менее, хорошая практика - удалить мышь (и другие) слушателей в java - это не приведет к неудачным утечкам памяти.

И это также хорошая практика для вашего destroy(), чтобы очистить все, что делает init(), даже если это не нужно.