private static final和private final的区别

5

这个问题已经在这里被问过了。根据答案:

private final int NUMBER = 10;

如果它不能改变,那么每个实例都没有意义。我的疑问是,如果类的实例比如每天创建一次,并持续几秒钟,将int(在某些情况下为对象)保存在内存中是否是一个好主意?假设可能会有许多(20-30)这样的对象。

6
你现在提出的问题涉及到过早优化。如果你真的想质疑这一点,那么你需要针对某个现有的内存有限的嵌入式设备给出实际的数字。 - skiwi
3
同意skiwi。这重要吗?谁在乎呢?垃圾收集足以处理这样的“废物”。 - Brian
1
想一想:private修饰符意味着只有(该类的实例)才能访问和修改属性。final表示对象构造后该值将不可修改。因此,除非您在构造函数中设置该值(最后允许的时刻),否则该值对于类的所有实例都是相同的 - 也就是说,您可以将其声明为static - Germann Arlington
实际上,考虑内存消耗确实有点过早优化。不应该考虑它。更重要的是设计问题。字段属于哪个范畴?类还是每个实例?例如:它是一个常量,只提供一个魔法值,在这个类的上下文中使用一个名称吗?那么将其设置为静态;它属于类。话虽如此,我认为几乎所有在声明时初始化的最终字段都是这样的常量。 - Seelenvirtuose
2个回答

4
你如何存储信息,很大程度上取决于它的用途。下面有几种可能的方法: private static final
如果该值在应用程序生命周期内永远不会被修改,则这是一个不错的选择。这意味着,在创建多个实例时,您只实际存储了这个特定变量一次。 private final
当该值可能针对对象的不同实例采用不同值,但任何特定实例在整个对象生命周期中都不会修改其值时,就要使用此选项。 如果您正在考虑的内容可能会在一段时间内采用不同的值,则可能会对您有所帮助。 public static int GetNumber(){...}
另一种方法是使用静态方法返回所需的值。这使得处理值的更改变得容易,但您还需要考虑在给定实例的整个生命周期中这种更改的影响。
希望这有所帮助...

静态与非静态在这里解释得很好,但它如何回答这个问题呢? - skiwi
1
我已经指出,如何存储值的选择非常取决于该值用于表示什么 - 这是事实。我还展示了三种方法,并描述了每种方法的适用情况...至于明确的答案,这取决于该值是否随对象实例而变化 - 因此需要我的解释。 - Martin Milan
他可能也希望反思一下,在静态final变量中持有大型对象是不明智的,因为它们会消耗内存资源。但整数不会成为问题... - Martin Milan

2
关于private final int number,你声称如果它不能改变,每个实例都有一份副本就没有意义,这是完全错误的。考虑以下代码,典型的不可变类:
private final int number;

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

在JDK中,以及全球各地的生产代码类中,有许多此模式的实例。


回答关于性能的问题,我怀疑您无法衡量使用静态常量与实例常量之间的差异。


'private final int number = 10;' 这行代码没有问题,第二行出现了编译错误。 - codingenious
@Batty 的确,如果你把第一行改成那样的话,它会报错,但现在这样是没问题的。构造函数结束时必须设置最终值,并且一旦设置后就不能再更改。 - Richard Tingle
@Bohemian,那行代码是Jon Skeet写的 :) - codingenious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接