2011-09-20 24 views
1

这对一些人来说可能看起来微不足道,但我试图从一开始就采取良好的习惯......应该用最小范围创建对象吗?

应该始终使用最小范围创建对象吗?

在下面的示例中,corner1仅在循环内部使用。在循环内创建(声明)它是否是最佳实践?

即为此

for(int i = 0; i < 1; i++){ 
     DoubleVector corner1 = new DoubleVector(); 

     // code where corner1 gets used 
    } 

,而不是

DoubleVector corner1; 

    for(int i = 0; i < 1; i++){ 
     corner1 = new DoubleVector(); 

     // code where corner1 gets used 
    } 

当然,如果我需要corner1以后,那么我想我必须去与第二个选项。

+1

*是否应该在最小范围内创建对象?*是:-) –

回答

4

这不是创建对象的最小范围,但声明变量的范围最小。这两者之间值得区分。

但是,一般来说,最好的做法是将变量的范围限制在理想范围内,并且只在需要时才声明它们。变量出现的代码面积越小,就越容易理解它的使用方式以及来自哪里。

4

是的,最好的做法是在循环中声明它。在这种情况下,原因主要是代码清洁。如果声明接近初始化,则更容易阅读,而且它更好地记录了变量的使用方式。

当然,如果对象可以是整个循环的所有迭代共享,它可能是把声明初始化循环之前有效的优化。

+0

不应该对GC产生任何影响。要么是它被引用(例如通过变量),要么它不是,但是如果该变量具有更大范围,则该变量不会同时保存多个引用。变量作用域并不重要(除了JIT,它可能会删除变量并因此提前引用 - 但对于更大的作用域,这实际上更有用),它只是在集合发生时可以达到的事情。 – delnan

+0

@delnan:它不应该对* good * GC有任何影响。但是一个天真的实现会比参与计算的参考超出范围更容易,因为它不会再被使用。 –

+0

即使引用计数在两种情况下都会执行更多工作(因为引用的计数更改就像变量创建/删除一样)。所有其他的GC只是不时地运行,只关心那个瞬间引用的内容,而不是当它可能超出范围。此外,即使某些奇怪的GC试图预测引用的生命周期,由于变量超出范围或由于赋值而导致该特定引用被删除也无关紧要。而且,JVM通常具有非常聪明的GC。长话短说,我没有看到任何理由甚至在这里提到GC,这只是令人困惑。 – delnan

2

是的,最好尽量减少变量的范围。它减少了混乱,并减少了在错误的时间意外地使用错误的东西的机会。

1

限制变量和对象的范围总是很好的做法。 不仅用于代码清理,而且因为它给垃圾收集器提供了chanches来重新使用清理臀部(如果在这种情况下提及对象而不是变量)。

此外,具有较大的变量可见性在编写代码时更容易出错。