Установить ссылку = null в блоке finally? - PullRequest
6 голосов
/ 09 июня 2010

Мой коллега устанавливает ссылку на null в блоках finally. Я думаю, что это чепуха.

public Something getSomething() {
    JDBCConnection jdbc=null;
    try {
        jdbc=JDBCManager.getConnection(JDBCTypes.MYSQL);
        ...
    }
    finally {
        JDBCManager.free(jdbc);
        jdbc=null; // <-- Useful or not?
    }
}

Что вы думаете об этом?

Ответы [ 7 ]

12 голосов
/ 09 июня 2010

Вы правы, jdbc - локальная переменная, поэтому, когда метод getSomething() вернет jdbc, он выйдет из области видимости и будет иметь право на сборку мусора, что фактически равнозначно установке в ноль. Поэтому нет смысла устанавливать переменную в null, если она выходит за рамки следующей строки кода.

Хорошей практикой является ограничение переменных до минимального необходимого объема, например если вам нужна только переменная внутри цикла for, объявите ее в цикле for, и она будет иметь право на сборку мусора, когда код выйдет из цикла for. Это, а также снижение сложности ваших методов снижает необходимость даже устанавливать нулевые локальные переменные, и в результате ваш код становится более модульным, его легче читать и поддерживать.

5 голосов
/ 09 июня 2010

Так как это локальная переменная, она все равно выйдет из области видимости.Это бессмыслица.

Если бы это была переменная экземпляра (переменная-член) долгоживущего объекта, это могло бы быть полезно, поскольку в противном случае сборщик мусора мог бы избавиться от объекта.

2 голосов
/ 09 июня 2010

Да, это в значительной степени глупость.Мотивация обычно состоит в том, чтобы «помочь» сборщику мусора, но это совсем не реальная помощь, так как ссылка все равно очищается.Хотя это и не причиняет вреда, по крайней мере, для виртуальной машины - ваши глаза и здравомыслие - это другое дело.

Однако пример не возвращает что-то.Если пример неполон, и после блока finally есть операторы, то установка jdbc на null может служить сдерживающим фактором для использования, и возникший NPE немедленно сообщает о любом использовании после блока finally.

1 голос
/ 09 июня 2010

как уже написано, в этом случае это бесполезно, потому что метод заканчивается после finally.
Я бы сделал это, если после try-finally есть код, чтобы в конечном итоге предотвратить его использование. И есть (очень редкие) ситуации, в которых это может помочь.
Взгляните на эту статью: Java Memory Puzzle

1 голос
/ 09 июня 2010

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

Это вопрос стиля кодирования. Есть небольшое преимущество, если однажды вы добавите больше кода после блока finally. Тогда сразу становится очевидно, что вы больше не можете использовать jdbc, потому что он был свободен от JDBCManager.

Так что да, это хорошая практика, чтобы аннулировать ссылки на удаленные ресурсы.

0 голосов
/ 09 июня 2010

тогда он должен установить все локальные переменные в null во всех методах перед возвратом.

JVM, вероятно, в любом случае оптимизирует линию, поэтому не имеет никакого эффекта времени выполнения.

0 голосов
/ 09 июня 2010

Если после блока finally было бы больше кода, чем просто заканчивать метод, это могло бы помочь сборщику мусора очистить его.

...