Java 如何确定某个对象不应声明为静态的?

Java 如何确定某个对象不应声明为静态的?,java,android,static,Java,Android,Static,我的规则是,对于原语,我可以随时声明它们static,因为它们不会占用太多内存。实际上,我通常使用静态原语作为项目常量 然而,我看到许多程序员也将对象声明为静态。显然,static对象会增加每个新的static对象的内存消耗 例如,我经常看到SharedReference对象被声明为静态的,这样任何类都可以通过在代码中的任何位置调用apply()从中更新信息。我不使用它,但我创建了作为实例对象的is,并以不同的方式处理登录 那么,我们如何确保能够安全地将某个对象声明为静态?我们是试着预测它的内存

我的规则是,对于原语,我可以随时声明它们
static
,因为它们不会占用太多内存。实际上,我通常使用
静态
原语作为项目常量

然而,我看到许多程序员也将对象声明为
静态
。显然,
static
对象会增加每个新的
static
对象的内存消耗

例如,我经常看到
SharedReference
对象被声明为静态的,这样任何类都可以通过在代码中的任何位置调用
apply()
从中更新信息。我不使用它,但我创建了作为实例对象的is,并以不同的方式处理登录

那么,我们如何确保能够安全地将某个对象声明为
静态
?我们是试着预测它的内存消耗还是有其他更好的方法

问题的原因是该项目在移动设备上占用了100MB或RAM。静态对象被不必要地使用,因此大量数据被保存在RAM中而不需要。一旦我将静态对象转换为实例对象,内存消耗就下降到60MB

另外,我见过在应用程序中使用静态对象的可怕案例,仅仅因为程序员懒得正确处理逻辑,这样的应用程序消耗的内存比他们应该消耗的要多100%

这个

显然,静态对象会增加每个新静态对象的内存消耗

这完全是错误的:静态引用不会比非静态引用消耗更多或更少的内存

当然,静态引用对象将保留在内存中,只要带有引用的类保留在内存中,这可能会一直持续到JVM结束

另一方面,如果每个需要
A
的实例都创建并持有
A
的实例,那么每个人都会比单个
A
消耗更多内存

但是,在99%的情况下,记忆力的消耗实际上是不相关的,所以我通常只在开始出现问题时才想到它,或者很明显,如果我不考虑问题,我就会遇到问题。 更重要的是以下标准:

  • 我是否需要一个不同的实例,例如用于测试

  • 真的每个人都需要相同的实例吗

  • 我可以使用继承吗

  • 当有疑问时,不要使用静电

  • 关于更新的问题,该问题澄清了OP询问的是内存约束设备的问题

    听起来好像有人在内存约束设备上使用静态引用对象作为某种缓存,即为了避免重新创建某些对象

    基于该假设,推理有所不同,结果大致相同:

  • 在你知道需要之前不要缓存东西

  • 如果你缓存了一些东西,确保它通过实际测量帮助你实现你的性能目标

  • 请确保没有其他中断,在这种情况下,尤其是内存约束

  • 如果有疑问:不要缓存


  • 最后:如果您需要缓存,请使用缓存,而不是像滥用的静态引用这样的黑客解决方案。

    您完全背对背地使用它。实例变量将使用更多内存,而静态变量需要强烈的动机使其成为静态变量。如果你还没有一个很好的理由让它们成为静态的,你就不应该这样

    另外,我见过在应用程序中使用静态对象的可怕案例,仅仅因为程序员懒得正确处理逻辑,这样的应用程序消耗的内存比他们应该消耗的要多100%


    彻头彻尾的胡说八道。你从来没有见过这样的东西。使用静态变量不会使内存增加一倍,除非从未实例化过该类。

    这与它们占用的内存无关,而与静态意味着什么无关。如果您的原语应该是唯一的,并且对于类的每个实例都可以是不同的,那么不要将其设置为静态的,也不要设置太多内存。对象也是一样,作为旁注,枚举是静态常量更好的替代品。静态对象将在应用程序的生命周期内生存,对吗?因此,它所占用的内存在应用程序进程结束之前不会消失。是吗?在移动设备上运行的应用程序中,这一点很重要。尝试解决您的评论和对问题的编辑给游戏带来的问题。我已经在这些项目中完成了内存分析,因此我确信。静态对象不必要地保存数据并占用内存,内存消耗从50-60MB增加到接近100MB或更高。一旦这些对象被转换为每个屏幕都会消失的实例对象,内存就会下降到60MB。还是胡说八道?只要你解释清楚了就不会了。问题中陈述的方式,绝对正确。编辑!所以在您看来,如何知道静态对象是否会消耗太多内存?