final static vs non-final静态变量?

时间:2013-03-18 19:30:54

标签: java multithreading design-patterns

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

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方法。)

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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