什么时候应该使用未初始化的静态最终变量?

问题描述:

什么时候应该使用未初始化的静态最终变量?我知道一个未初始化的静态最终变量只能在静态初始化块中赋值,但我想不出有什么实际用途。什么时候应该使用未初始化的静态最终变量?

+0

也许_never_? – 2012-01-31 17:43:48

+0

“空白”是什么意思?你的意思是一个'static final'变量被初始化为'null'吗?或者你只是指任何一种'static final'变量('private static final','public static final'等)? – 2012-01-31 17:44:03

+0

他意味着空白,因为在未初始化。 – fivedigit 2012-01-31 17:45:44

我假设你的意思是:

public static final Object obj; 

与没有明确分配初始值?

您可以根据只能在运行时发生的某些计算将它分配到static块中,如读取某些属性文件以创建在编译时未知的应用程序范围内的常量。

+0

非常感谢! – 2012-02-02 18:32:04

+0

@Tudor,为什么它默认为'null'?这种行为在规格中保证了吗?在我看来,默认值是未定义的,因为我们无法在分配之前先读取它(编译器错误)。 – Pacerier 2014-06-17 16:34:29

+0

@Prier:看上去很好。如果不给“final”字段赋值,确实会产生编译时错误,规范说这些字段永远不会被默认。我纠正了我的答案。 – Tudor 2014-06-17 16:43:33

当初始化变量不能在一行中完成时使用它。例如:

private static final Map<String, String> CACHE; 

static { 
    Map<String, String> cache = new HashMap<String, String>(); 
    cache.put("foo", "bar"); 
    cache.put("zim", "bam"); 
    // lots of other entries 
    CACHE = Collections.unmodifiableMap(cache); 
} 

基本上,如果您需要指定一个不能在单个表达式中轻松表示的值。例如,您可能想要执行一些逻辑来构建不可变映射,然后分配它。

一般来说,更具可读性把“建设”逻辑到一个单独的静态方法和使用,在正常作业,但:

private static final Map<String, String> FOO_MAP = buildFooMap(); 
+0

谢谢!它给了我更好的解释。 – 2012-12-31 10:40:05

静态+最终

总之,

静态 - 以使其为类变量 - 独立对象的(可通往每个对象总是相同的位置)

Final - 使它成为一个常数(如果final是在变量ofcourse!之前!)

我们在哪里只需要静态?

=>可以计算一个对象的实例数量。

我们在哪里只需要最终?

=>好,让事情不变!

我们在哪里需要static + final?

=>使变量可以访问每个对象,并使一个常量。为COLOR创建类可能是。

对于空白静态变量,初始化由静态块完成。

public class StaticDemo 
{ 
    private static final String name; 

    static 
    { 
     name = "yash"; 
    } 
} 

为什么使用空白的?因为可能是你一开始就无法初始化。我接受前一个的。

如果静态字段的初始化程序可能会引发异常,则无法将其初始化为一行,但必须具有静态块或静态方法。

+0

谢谢!它可以是未初始化的静态最终变量的一种用法。 – 2012-12-31 10:38:29

静态final变量必须在创建时初始化,与空白最终变量不同,不能将初始化推迟到构造函数,因为它们是静态的。