我们什么时候应该使用未初始化的静态最终变量?我知道一个未初始化的静态最终变量只能在静态初始化程序块中赋值,但我想不出任何实际用途。
答案 0 :(得分:17)
在初始化变量时无法在一行中使用它。例如:
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);
}
答案 1 :(得分:8)
我认为你的意思是:
public static final Object obj;
没有明确指定初始值?
您可以基于某些只能在运行时发生的计算在static
块中分配它,例如读取一些属性文件以创建在编译时未知的应用程序范围的常量。
答案 2 :(得分:5)
基本上,如果您需要指定一个不能在单个表达式中轻松表示的值。例如,您可能希望执行一些逻辑来构建不可变映射,然后分配它。
通常,将“构建”逻辑放入单独的静态方法中更具可读性,并在正常分配中使用它:
private static final Map<String, String> FOO_MAP = buildFooMap();
答案 3 :(得分:0)
<强>静态+最终强>
简而言之,
静态 - 使其成为一个类变量 - 独立于Object(始终可以访问每个对象的相同位置)
最终 - 使其成为常数。(如果最终在变量之前!)
我们在哪里只需要静态?
=&GT;可以计算一个对象的实例数。
我们只需要最终决定?
=&GT;好吧,让事情不变!
我们在哪里需要静态+最终?
=&GT;使变量可以访问每个对象并使其成为常量。在为COLOR创建类时可能是。
对于空白静态变量,初始化由静态块完成。
public class StaticDemo
{
private static final String name;
static
{
name = "yash";
}
}
为什么要使用空白?因为可能你不能在开始时初始化。我接受前一个。
答案 4 :(得分:0)
如果静态字段的初始化程序可以抛出异常,则无法在一行中初始化它,则必须使用静态块或静态方法。
答案 5 :(得分:0)
静态final变量必须在创建时初始化,与空白的final变量不同,您不能将初始化推迟到构造函数,因为它们是静态的。