常量

java puzzler 93

1对于常量域的引用会在编译期被转化为它们所表示的常量的值[JLS 13.1]。

这样的域从技术上讲,被称作常量变量(constant variables)。一个常量变量的定义是:一个在编译期被常量表达式初始化的final 的原始类型或String 类型的变量[JLS4.12.4]

2 是null 不是一个编译期常量表达式

 

package arkblue.javapuzzler.n93; public class PrintWords { public static void main(String[] args) { System.out .println(Words.FIRST + " " + Words.SECOND + " " + Words.THIRD); } }

 

package arkblue.javapuzzler.n93; public class Words { private Words() { }; // Uninstantiable public static final String FIRST = "the"; public static final String SECOND = null; public static final String THIRD = "set"; }

运行客户端程序,打印:

the null set

 

修改Words.java, 但是不编译PrintWords.java,

package arkblue.javapuzzler.n93; public class Words { private Words() { }; // Uninstantiable public static final String FIRST = "physics"; public static final String SECOND = "chemistry"; public static final String THIRD = "biology"; }

运行 PrintWords.main 打印结果

the chemistry set

 

如果你使用了一个非常量的表达式去初始化一个域,甚至是一个final 域,那么这个域就不是一个常量。

 

修改 Words.java

package arkblue.javapuzzler.n93; public class Words { public static final String FIRST = ident("the"); public static final String SECOND = ident(null); public static final String THIRD = ident("set"); private static String ident(String s) { return s; } }

这时修改库代码,客户端调用就不需要重新编译。

你可能感兴趣的:(常量)