我的一位同事在finally块中引用了null
。我认为这是无稽之谈。
public Something getSomething() {
JDBCConnection jdbc=null;
try {
jdbc=JDBCManager.getConnection(JDBCTypes.MYSQL);
...
}
finally {
JDBCManager.free(jdbc);
jdbc=null; // <-- Useful or not?
}
}
你怎么看?
答案 0 :(得分:12)
你是对的,jdbc
是一个局部变量,所以当getSomething()
方法返回jdbc
时,它将超出范围并且有资格进行垃圾收集,这实际上与将其设置为空值。因此,当它在下一行代码中超出范围时,将变量设置为null是没有意义的。
优良作法是将变量限制在所需的最小范围内,例如:如果你只需要一个for循环中的变量然后在for循环中声明它,当代码退出for循环时它将有资格进行垃圾收集。这样做,以及降低方法的复杂性,甚至可以减少将局部变量设置为null的需要,并且有利于您的代码变得更加模块化,更易于阅读和维护。
答案 1 :(得分:5)
因为它是一个局部变量,所以它无论如何都会超出范围。这是无稽之谈。
如果它是长寿命对象的实例变量(成员变量),它可能很有用,因为它可能会阻止垃圾收集器处理对象。
答案 2 :(得分:2)
是的,这几乎是胡说八道。动机通常是“帮助”垃圾收集器,但这根本不是真正的帮助,因为无论如何都要清除引用。虽然它也没有任何伤害,至少不是对于VM - 你的眼睛和理智是另一回事。
但是,该示例不会返回Something。如果示例不完整,并且在finally块之后实际上有语句,那么将jdbc设置为null
可以起到阻止使用的作用,并且会立即发生的NPE通知finally块之后的任何使用。
答案 3 :(得分:1)
在这个特殊情况下,从技术上说,它真的没用。当方法返回时,jdbc
不再存在,并且不会保持对连接的引用,因此它不会影响垃圾回收。
这是编码风格的问题。如果有一天你在finally块之后添加更多代码,那么有一个小优势。然后很明显你不能再使用jdbc
了,因为它已被JDBCManager释放了。
是的,优良作法是取消对已处置资源的引用。
答案 4 :(得分:1)
已经写好了,在这种情况下它是没用的,因为该方法在最后一个之后结束 我会这样做,如果在try-finally之后有代码,最终会阻止它的使用。并且(非常罕见)可以提供帮助的情况 看看这篇文章:Java Memory Puzzle
答案 5 :(得分:0)
然后他应该在返回之前将所有局部变量设置为null。
JVM可能无论如何都会对线路进行优化,因此它没有任何运行时效果。
答案 6 :(得分:-2)
如果在finally块之后会有更多代码而不是仅仅结束方法,那么它可能有助于垃圾收集器清理它。