2015-08-13 4 views
7

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

Но я обнаружил, что Object класса не имеет реализации для finalize способ.

protected void finalize() throws Throwable { } 

Для чего нужно позвонить super.finalize()?

+2

В классе могут быть другие классы, находящиеся между вашим классом и «Объектом» – JonK

+0

Вы правы, но в этом случае SonarQube должен поймать это, прежде чем поднимать предупреждение! – egelev

+2

Серьезно, вы посмотрели, что говорит sonarQube? - ** в случае, если родительские реализации также должны располагать некоторыми системными ресурсами ** – TheLostMind

ответ

6

Это не нужно, это финализатор, записывающий идиому, за которой следует следовать.

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

идиома является

try { 
    // Do whatever the finalization is 
} 
finally { 
    super.finalize(); 
} 

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

И, конечно же: Избегайте финализаторов. (Пункт 7 в «Эффективной Java» Джошуа Блоха, второе издание).

+0

Ya .. +1 для последней строки. * финализаторы - злые *: P – TheLostMind

5

Метод finalize класса Object не выполняет особых действий; он просто возвращается нормально. Подклассы объекта могут переопределять это определение.

Кто знает, super класс вашего нынешнего класса в этом способе.

Посмотрите, где вы находитесь, внизу иерархии.

Object --- no implementation 

    -- 

    -- Your Super class -- Overriden the finalize 

     -- Current class 

Super не всегда представляет класс Object. Не может быть супер классов в середине.

1

Ошибка в SonarQube также четко указана. Учтите, что класс, который вы пишете, может иметь родительскую иерархию в любой момент времени. Для эффективной очистки всегда просматривается иерархия выше. Независимо от того, есть ли у вас суперкласс, использование super.finalize(), таким образом, полезно для очистки ссылок, переданных от родителя.

Смежные вопросы