2014-03-24 33 views
4

此问题已被要求here。由于每答案:私人静态决赛vs私人决赛

private final int NUMBER = 10; 

如果它不能改变,还有是每个实例一个副本没有意义。

我的疑问是如果创建了类的实例,说一天一次,并且它持续几秒钟。将int(在某些情况下为object)保存在内存中是不错的主意吗?

假设,可以有许多(20-30)个这样的对象。

+6

你现在的问题是处理不成熟的优化问题。如果您真的想对此提出质疑,那么您需要为现有的内存有限的嵌入式设备提供真实的数字。 – skiwi

+3

同意skiwi。有关系吗?谁在乎?垃圾收集不仅能够处理这种“浪费”。 – Brian

+1

试想一下:'private'修饰符意味着只有(这个类的实例)能够访问和修改属性。 'final'意味着在对象构造之后该值不会被修改。因此,除非你在构造函数中设置了值(最后允许的时刻),否则该值对于该类的所有实例都是相同的 - 即你可以声明它是静态的。 –

回答

3

您如何存储信息很大程度上取决于它的用途。

有几个方法,你可能需要:

私有静态最后

这是一个不错的选择,如果该值将永远不会应用程序的生命周期中进行修改。这意味着,当你创建多​​个实例时,你实际上只是存储这个特定的变量ONCE。

私人最终

这意味着当该值可能需要对你的对象的不同实例的不同值的那些时间,但任何具体的实例将不会有它的整个对象的生命时间的修正值。

如果您正在寻找一些可能会在一定时间范围内呈现不同数值的东西,那么您可能会对此感兴趣。

公共静态INT GetNumber(){...}

你可以考虑另一种方法是有一个静态方法返回你后的值。这可以很容易地处理值的变化,但是您还需要考虑在任何给定实例的整个生命周期中这种变化的影响。

希望帮助...

+0

这里解释了静态与非静态,但它是如何回答这个问题的? – skiwi

+1

我已经指出,如何存储价值的选择很大程度上取决于价值是用来表示 - 它是做什么的。我还展示了三种方法,并描述了每种方法何时适用...至于确定的答案,取决于这个值是否相对于对象实例而改变 - 因此我的解释。 –

+0

他也许还希望反映,将大对象放在静态最终变量中是不明智的,因为它们消耗内存资源。 Ints不会成为一个问题,虽然... –

2

关于private final int number,你声称

如果它不能改变,还有是每个实例一个副本没有意义

是绝对错误的。考虑以下代码,典型的不可变类:

private final int number; 

public MyClass(int number) { 
    this.number = number; 
} 

有在JDK这种模式很多情况下,并在生产代码类世界各地。


要回答关于性能的问题,我怀疑你可以衡量使用静态和实例常量之间的差异。

+0

'private final int number = 10;'第二行给出编译错误。 – Batty

+0

@Batty事实上,如果你把第一行改成那样,它确实会给出这样的错误,但是它的确如此。最终值必须在构造函数的末尾设置,并且一旦设置为 –

+0

,一定不能更改,即一旦设置,就不能更改。 – Batty