final static vs non-final静态变量?

有没有人知道这两种方法的不同之处?

public class SingleTone { private static final instance = new SingleTone(); private SingleTone() { } public [static] SingleTone getinstance() { return instance; } } 

 public class SingleTone { private static instance = new SingleTone(); private SingleTone() { } public [static] SingleTone getinstance() { return instance; } } 

我知道最终的静态变量是线程安全的但是我找不到非最终的变量。 (注意:我正在寻找最终静态变量与非最终静态变量的差异,所以请不要建议如何实现Singleton设计模式。我知道有一种Enum方法。)

编辑:我错过了方法上的静态关键字现在已修复!

除了可能的编译器优化之外没有太大区别。 在任何一种情况下,因为它是私有的没有setter,所以没有任何东西可以修改它,所以如果它是final并不特别重要。 但是,在这两种情况下,您的getInstance()方法都需要声明为static

final修饰符意味着不会将任何其他内容分配给该字段。 那就是你不能在它上面使用equals(=)运算符。 虽然static修饰符意味着变量是类的一部分而不是实例的一部分,所以无论你有多少个实例,它都只有一个。

然后第一种方法使引用线程安全,因为我们知道初始化后该值不会改变。 但是,如果我们有最终结构,我们需要确保内容也是同步的。 有关详细信息,请参阅此问题 。

final将不会对您的情况有任何特殊的性能提升。

我们使用final来进行清晰的设计方法。 根据Josh Bloch的“inheritance设计或禁止它”的经验法则,对于一般的课程,应该更频繁地使用final,而不仅仅是针对这种情况。