如果我们可以让一个领域静止,我们应该这样做吗?

时间:2015-07-28 12:28:27

标签: java static

我的问题是在Java中使字段静态化。我们每次都能做到这一点真的应该这样做吗?例如,潜在静态实例的值不依赖于实例本身,只要某个实例的状态发生更改,就不会更改。

4 个答案:

答案 0 :(得分:2)

Static个字段属于一个类,因此由class的所有对象共享,因此内存使用量较少......如果要在对象之间共享该字段,则是你可以这样做..如果你将该字段声明为publicstatic,那么它可以全局供所有人使用。

现在这有一个问题...

假设您正在使用static字段执行某些操作并且由所有对象共享...因此,如果任何对象更改了该值,则在所有对象中对其进行更改,因为每个对象都共享该字段对象...这会破坏你的执行和程序......

现在我认为,这取决于你必须做什么...如果它需要使场保持静态,那么一定要这样做...但是由于我上面提到的问题,更喜欢使场非静态..

答案 1 :(得分:2)

声明实例变量时,它们占用每个实例的内存。因此,如果有一个对象的2,000个实例,并且你有一个32位变量,那就浪费了8KB的内存。另一方面,如果它是静态的,它只为类创建一次,所以我们使用1B而不是使用8KB。

这是否重要取决于具体情况。在嵌入式系统中工作,我将尽我所能保存8KB。在合理的桌面上,我可能并不在乎。

我想我的问题是,您是说可能不会更改或不会更改。如果有人可能想要更改它,或者它的值将与实例的状态相关联,则它不应该是静态的。如果每个实例100%相同,我会说它应该是静态的。

但是,我总是会添加警告,做一些似乎使代码最具可读性并且在您的情况下最有意义的事情。由于我们假设说话,很难确定在你的情况下应该做些什么。

答案 2 :(得分:1)

除非你真的需要节省内存,否则要通过声明static final或保持原样来使字段保持不变。

根据我的经验,静态非最终字段只会让您遇到麻烦,因为通常很难找到无法预料的副作用。

答案 3 :(得分:0)

您在问题中添加了以下内容:

  

例如,潜在静态实例的值并不依赖于实例本身,只要某个实例的状态发生变化,就不会改变它。

我想你知道你在做什么。很多人说不使用静态,但他们真正说的是,"如果你不知道自己在做什么,那就不要使用静态。"但只要您了解静态字段属于类而不是实例,从而实现并计算其后果,那么请继续执行。

例如,我喜欢将log4j Logger作为静态最终字段。它们是最终的,并以类命名,并且不抛出需要处理的异常。因此,在这种情况下,内存占用最好只有一个Logger而不是每个实例的一个分区。

上面提到的一个重大问题是,该静态字段的初始化是否具有必须处理的潜在异常。很多时候,最后一道障碍迫使我将场变成非静态的。