Как уничтожить объект сам по себе - PullRequest
17 голосов
/ 20 июля 2011

Есть ли решение для уничтожения текущего экземпляра объекта в себе?

Я ищу что-то похожее на:

class KillMe {
    ....
    public void destroy() {
        this.getObject = null //this is only for demonstrate my idea
    }

    ....
}

Ответы [ 4 ]

19 голосов
/ 20 июля 2011

Java-объекты живут до тех пор, пока на них больше нет ссылок.Поскольку объект не может определить, сколько ссылок существует на него, объект не может "уничтожить себя".

4 голосов
/ 20 июля 2011

Объект не имеет доступа к ссылкам на него, поэтому нет способа установить их на null или что-то еще. Объект может быть «уничтожен» только тогда, когда сборщик мусора приходит и очищает все не связанные объекты.

Как говорится, попробуйте это:

public void destroy() {
    System.exit( 0 );
}
1 голос
/ 20 января 2015

Нет, объекты не могут самоубийства. Любая ссылка сама по себе является просто ссылкой.

Чтобы «очистить» объект внутри себя, нужно просто очистить все переменные экземпляра.

Чтобы «очистить» объект вне себя, нужно установить переменную равной нулю.

0 голосов
/ 20 июля 2011

Ваш пример того, что вы хотите сделать, демонстрирует отсутствие понимания того, как / когда объекты уничтожаются / очищаются.

class KillMe {
    ....
    public void destroy() {
        this.getObject = null //this is only for demonstrate my idea
    }
}

Вызов, который вы там делаете (this.getObject), получает ссылку натекущий объект, а затем устанавливает для этой ссылки значение null (т. е. больше не указывает на текущий объект. Он ничего не делает для самого объекта и не изменяет другие переменные в другом месте кода, которые указывают на объект.

Рассмотрим это следующим образом ... переменные указывают на значения (объекты). Пока переменные не указывают на заданное значение, это значение сохраняется (не собирается / уничтожается). Чтобы удалить всепеременные ссылаются на значение, вам нужно найти все переменные, которые указывают на него, и направить их на что-то другое (например, null). Реально, вы не можете сделать это (хотя я полагаю, что нет ничего невозможного с достаточно страшным отражением и /или магия байт-кода;)

Если подумать об этом иначе, если вы смогли уничтожить само значение / объект, то чтослучится ли со всеми другими переменными, которые в данный момент указывают на него?Они теперь указывают на освобожденную память, приводящую к некоторой версии Java segfault?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...