Возможно ли вызвать метод finalize для int или vector?

#java #garbage-collection

#java #сборка мусора

Вопрос:

Возможно ли вызвать метод finalize для int или vector в Java?

Комментарии:

1. не волнуйтесь. Например, в C # даже int являются объектами, поэтому у них есть методы.

2. @Seva: Я не волнуюсь, но у вас есть несколько неверных предположений, и самое главное, это не C #.

3. НИКОГДА не вызывайте метод finalize.

4. Я думаю, что если метод finalize существует, у него есть какая-то утилита. Так что успокойтесь. 😛

5. @Seva: пожалуйста, перестань казаться глупым.

Ответ №1:

int Не является объектом и не имеет методов.

java.util.Vector Имеет (как и любой объект) finalize() метод, но он вызывается автоматически, когда объект собирается из мусора.

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

Комментарии:

1. могу ли я изменить метод finalize для вектора? Спасибо

2. @Seva: да, вы можете, но нет, вы не должны этого делать. Вызов этого метода не приводит к сбору мусора объекта.

3. Я знаю, что это не гарантирует, но я хотел бы проверить размер вектора в байтах и суммировать с переменной, прежде чем сборщик мусора заберет объект. Как мне это сделать, пожалуйста?

4. @Seva: почему ты не поместил это в свой исходный пост. Вы можете расширить Vector и переопределить его метод finalize, но обычно это продлевает срок его службы и, таким образом, снижает вероятность своевременного сбора мусора. Пожалуйста, посмотрите ссылку в моем ответе ниже.

Ответ №2:

Я думаю, что некоторые «сходят с ума», потому что в вопросе так много неверных предположений.

int это примитив, поэтому у него нет метода finalize для вызова.

Vector это устаревший класс, который был заменен в Java 1.2 (1998) на ArrayList. У него есть метод finalise, который защищен. protected означает, что он должен вызываться только из подкласса. Таким образом, вы не можете легко получить к нему доступ.

Однако я не предлагаю вам вызывать finalize для Vector или любого другого класса. Если у вас есть метод finalize, который обладает функциональностью, которую вы хотели бы вызвать, создайте общедоступный метод, который выполняет то же самое, а не вызывает finalise()

Кстати: Даже если вы вызывали Vector.finalize() это ничего не делает. Он наследует Object.finalize(), который является {}

Ответ №3:

Какова ваша мотивация для этого и как это связано со сбором мусора? Чтобы сделать объект доступным для сбора, вам нужно удалить все строгие ссылки на него, не вызывайте finalize.

Пожалуйста, прочтите эту важную ссылку по сборке мусора и, в частности, раздел «Доработано», раздел A.3.6 Правда о сборке мусора

Комментарии:

1. вы не думаете, что метод finalize связан со сборщиком мусора?

2. @Seva: Я не говорю, что это не связано. Я говорю, что вы не должны вызывать его напрямую и что его вызов не делает объект собираемым. Виртуальная машина Java вызовет finalize, если она присутствует до освобождения памяти объекта. Еще раз, пожалуйста, посмотрите на ссылку выше, поскольку там все прописано.

3. Я думаю, что если метод finalize существует, у него есть какая-то утилита. Так что успокойтесь. :P. Я поставлю 1 за вас.

4. @Seva: Я спокоен, но меня не волнует, что другие вкладывают слова в мои уста. Я никогда не говорил, что у него нет утилиты, просто что вы не должны вызывать его напрямую, и что это «утилита» хорошо прописано в ссылке выше.

Ответ №4:

Метод finalize() унаследован от java.lang.Object . Java int является примитивным типом, и эти типы не считаются объектами, поэтому для них невозможно вызвать finalize.