我阅读了开发人员在其他线程上关于使用静态变量的几条评论:
我理解使用静态是违背OOPS概念的,内存管理很差,这违背了封装的概念。如果我使用5-6静态变量,影响会非常大,以至于我不得不停止使用它。或者可能是来自你们的人,可以建议我在Java中实际使用静态,这是一种面向对象的编程语言?
发布于 2015-03-17 11:40:44
它消耗内存:当我们从定义/创建静态变量的类退出时,是否有一种释放被静态变量占用的内存的方法?
好的。点1->所有变量,不管是静态的还是其他的,都占用内存。因此,它的成本内存是不准确的。
接下来,静态变量和实例变量之间的区别在于它们何时变得不可访问(为GC做好准备)。当您超出实例的范围时,实例级别的实例将变得不可访问,但是使用静态引用引用的实例,除非显式地设置为null,否则它们将是可访问的。
所以,
static Object o = new Object();
o=null ;不会将对象保存在内存中。如果没有显式地设置为null,则o指向的实例将一直存在,直到定义它的类获得GCed,而当加载该类的类加载器获得GCed时(前提是引用尚未转义),GCed就会发生。
挫败了封装的概念。
静态字段不会破坏封装。封装基本上不允许访问内部结构。在这一点上可能有多个论点,所以我不讨论这个问题。
如果我使用5-6静态变量,影响会非常大,以至于我不得不停止使用它。
静态是设计选择的,而不是实现选择。在我看来,使用静态作为一个失败的选项。
发布于 2015-03-17 11:41:35
这是有争议的。
理想情况下,您希望拥有与所有实例相同的静态事物,即与类的概念相关的东西,而不是单个实例(例如)。Integer.parseInt()
静态变量/常量与之相关,例如默认值(Dog.defaultNumberOfLegs=4)。
静态的可变事物更棘手,而且,imho是共享状态的一个讨厌的缩写。这对于快速的实验是很好的,但是在你的生产代码中很难保存,因为由于模拟它的难度越来越大,静态的东西变得很难测试。如果您希望事物是唯一的,那么一旦您转到实际的生产代码中,就应该使用它。
撇开这一点不谈,5个或6个变量不应该成为太多的内存麻烦。它更多地与优雅/可接触性/可测试性有关。这是所有“正常”的情况。如果您真的投入其中,您可以使用单个静态变量创建引用链,这些变量会阻塞您的内存,但这不是一个现实的场景。
https://stackoverflow.com/questions/29098003
复制相似问题