undefined

Финализируем с finalize

Java Syntax
6 уровень , 3 лекция
Открыта

— И снова привет! Сегодня будет кратенькое знакомство с методом finalize(). Этот метод вызывается Java-машиной у объекта перед тем, как объект будет уничтожен. Фактически этот метод – противоположность конструктору. В нем можно освобождать ресурсы, используемые объектом.

— Этот метод есть у класса Object и, следовательно, есть в каждом классе (все классы в Java считаются унаследованными от класса Object и содержат копию его методов). Ты можешь просто написать в твоём классе такой же метод, и он будет вызываться перед уничтожением объектов этого класса.

Пример:

Пример:
class Cat
{
    String name;

    Cat(String name)
    {
        this.name = name;
    }

    protected void finalize() throws Throwable
    {
        System.out.println(name + " destroyed");
    }
}
undefined
2
Задача
Java Syntax,  6 уровень,  3 лекция
Недоступна
Набираем код Ӏ Java Syntax: 6 уровень, 3 лекция
Java Syntax: 6 уровень, 3 лекция. Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.

— Понятно.

— Но! Java-машина сама решает – вызвать данный метод или нет. Чаще всего объекты, созданные в методе и объявленные мусором после его завершения, уничтожаются сразу же и без всяких вызовов метода finalize(). Этот метод скорее дополнительная страховка, чем надёжное решение. Лучшим вариантом будет освобождать любые используемые ресурсы (обнулять сохраненные ссылки на другие объекты), когда наш объект ещё жив. О пользе этого метода и нюансах его работы я расскажу тебе уровней через 10, или 20. А пока что ты должен знать две вещи: такой метод существует, и (сюрприз!) не всегда вызывается.

Комментарии (144)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
PSArus 8 уровень, Новосибирск
19 февраля 2021
такое ощущение, что лекции размазывают для подгона их количества около 12ти, поскольку конкретно вот тут - ничего нового после статьи "профессора" с прошлой лекции.
Тимур Исхаков 28 уровень, Ульяновск
16 февраля 2021
Привет с уровня 23. Скорее всего, вы забудете о существовании этого метода, как и я. Никакой практической пользы он не несет, знать о нем стоит только для быстрой идентификации плохих и устаревших решений в коде.
Jim 9 уровень
7 января 2021
Ребята, я новичок, но думаю этот метод полезен хотя бы в одном: Он помогает наглядно увидеть, как работает удаление объекта. Без него эта лекция была бы намного короче и менее содержательнее. Может для кого-то из нас придет время, когда будем учить других, что мол объект должен удаляться. А так, хотя бы есть наглядность и в IDEA можно опробовать. Ведь для каких-то учеников мало будет слов «Вот мы обнулили ссылку, а объект удалит JVM. Ты не переживай, он удалиться». Но тут на помощь придет несчастный finalize() и выручит учителя заочной "прады". Но повторюсь, я новичок, и говорю это через призму "молодости" :) Не судите строго, ребята… :)
Сергей 22 уровень
29 декабря 2020
Про метод finalize() гуглите, тут мало чего рассказали, а он очень нужен!
Vaha 12 уровень, Москва
26 ноября 2020
В предыдущей лекции профессор давал ссылку. там подробно написано про finalize, в частности про его некорректную работу и , как следствие, отсутствие в нём необходимости.
Кристина Петрова 16 уровень, Минск
17 ноября 2020
В Java Code Conventions не рекомендуют использовать finalize(); https://google.github.io/styleguide/javaguide.html#s6.4-finalizers Finalizers: not used It is extremely rare to override Object.finalize. Tip: Don't do it. If you absolutely must, first read and understand Effective Java Item 7, "Avoid Finalizers," very carefully, and then don't do it.
Сергей 27 уровень, Москва
6 ноября 2020
Непонятно - а если в классе создано несколько объектов, то как finalize поймет, какой из них удалять?
Roman Kuzmych 14 уровень
12 октября 2020
finalize в среде IDEA перечеркнут, это нормально?(там ещё ссылка "The finalization mechanism is inherently problematic.")
Sergey Gavrilov 8 уровень, Москва
10 октября 2020

protected void finalize() throws Throwable
    {
        System.out.println(name + " destroyed");
    }
Не пойму, когда в методе finalize() прописывается sout, метод переопределяется или нет? В статье https://javarush.ru/groups/posts/1930-zhiznennihy-cikl-obhhekta- в аналогичном случае была приписка @Override, а здесь про переопределение ни слова ни в тексте, ни в коде...
Anton 25 уровень, Москва
5 октября 2020
В Object.java для метода finalize() проставлена аннотация @Deprecated(since="9"). Не является ли это поводом пересмотреть часть лекций про finalize?