Java中静态的最佳用途是什么

时间:2015-03-17 11:33:14

标签: java oop variables static

我在其他线程上阅读了开发人员关于使用静态变量的几点评论:

  1. 内存成本:当我们从定义/创建它们的类退出时,有没有办法释放静态变量占用的内存?
  2. 在内存管理方面使用静态与静态最终变量之间的区别是什么,以防您无法使用它。
  3. 据我所知,使用静态是针对OOPS概念,内存管理很差,打败了封装的概念。如果我使用5-6个静态变量,那么影响会非常大,以至于我不得不停止使用它。或者可能是你们的某些人可以建议我在Java中实际使用静态的面向对象编程语言?

2 个答案:

答案 0 :(得分:1)

  

它需要内存:有没有办法释放静态占用的内存   我们退出定义/创建它们的类时的变量?

确定。第1点 - >所有变量 静态无论占用内存。所以成本记忆并不准确。

接下来, static和instance 变量之间的区别在于它们变为无法访问(为GC准备好)。当您离开其范围但实例级别实例变为无法访问但是静态引用引用的实例时,除非明确设置为null,否则它们将是可访问的。

所以,

static Object o = new Object();
o=null ;

不会将对象保留在内存中。如果未将null 显式设置为,则o指向的实例将一直存在,直到定义它的类获得GCed,这在加载此类的类加载器时发生class得到GCed(如果引用没有转义)。

  

打败封装的概念。

静态字段不会破坏封装。封装基本上不允许访问内部结构。关于这一点可以有多个论点,所以我不会接受这个。

  

如果我使用5-6个静态变量,那么影响会如此之大   字面上必须停止使用它。

同样,它归结为第1点。静态设计选择,而不是实现选择。在我看来,使用 static 作为丢失的选项。

答案 1 :(得分:0)

这是值得商榷的。

理想情况下,您希望将所有实例共有的内容静态化,即与类的概念相关而不是单个实例(例如Integer.parseInt())。

静态最终变量/常数种类与它有关,例如默认值(Dog.defaultNumberOfLegs = 4)。

静态可变的东西比较棘手,而且,imho,是一个拥有共享状态的hacky简写。有利于快速实验,但由于模拟它的难度越来越大,因此静态内容变得难以测试,因此很难保留在生产代码中。如果你想让事物变得独一无二,那么一旦你转向真正的生产代码,就应该用它来制作一个单例。

除此之外,5或6个变量不应该是太多的记忆麻烦。它与优雅/可持续性/可测试性更相关。这适用于所有“正常”情况。如果你真的把它自己放进去,你可以创建一个带有单个静态变量的引用链来阻塞你的记忆,但这不是一个真实的场景。