Java中变化无常的常量
程序员文章站
2022-05-25 23:13:40
...
Java中变化无常的常量
问题:
第一版:
直接编译UserConstantsTest,编译过程中会检测到UserConstants尚未编译,然后会编译UserConstants
运行结果如图所示:
第二版:
只修改UserConstants,并且只重新编译UserConstants,得到结果如下图所示:
运行结果如图所示:
原因:
Java编译器会讲常数值编译到UserConstantsTest 的指令码或者常量池中,当UserConstantsTest使用这些常量时直接使用保存在类文件中的副本,但是null不是常量值,不受此限。
解决:
第一种:使用get方法来获取常量值
第二种:使用ident方法来获取常量值
参考:
Inconstant Constants in Java:http://www.javaworld.com/community/node/3400
问题:
第一版:
直接编译UserConstantsTest,编译过程中会检测到UserConstants尚未编译,然后会编译UserConstants
public class UserConstants { public static final String USER_NAME = "admin"; public static final String PASSWORD = "123456"; public static final String DESCRIPTION = null; }
public class UserConstantsTest { public static void main(String[] args) { System.out.println("User Name: " + UserConstants.USER_NAME); System.out.println("Password: " + UserConstants.PASSWORD); System.out.println("Description: " + UserConstants.DESCRIPTION); } }
运行结果如图所示:
第二版:
只修改UserConstants,并且只重新编译UserConstants,得到结果如下图所示:
public class UserConstants { public static final String USER_NAME = "root"; public static final String PASSWORD = "123456789"; public static final String DESCRIPTION = "This is root account"; }
运行结果如图所示:
原因:
引用
First, true constant variables are inlined.
Second, null is not a constant variable and thus is not inlined and so the actual constant on the classpath is used in that case.
Second, null is not a constant variable and thus is not inlined and so the actual constant on the classpath is used in that case.
Java编译器会讲常数值编译到UserConstantsTest 的指令码或者常量池中,当UserConstantsTest使用这些常量时直接使用保存在类文件中的副本,但是null不是常量值,不受此限。
解决:
第一种:使用get方法来获取常量值
public static final String USER_NAME = "admin"; public static String getUserName () { return USER_NAME; }
第二种:使用ident方法来获取常量值
private static String ident(final String constant) { return constant; } public static final String USER_NAME = ident("root"); public static final String PASSWORD = ident("123456789"); public static final String DESCRIPTION = ident("This is root account");
参考:
Inconstant Constants in Java:http://www.javaworld.com/community/node/3400
推荐阅读
-
Java中keytool的使用
-
浅谈Java中hashCode的正确求值方法
-
JAVA开发中的一些规范讲解(阿里巴巴Java开发规范手册)
-
Java中finally和return的关系实例解析
-
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
-
Java中是使用增强for的null问题
-
详解java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝)
-
Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
-
Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全
-
Java中Date()类 日期转字符串、字符串转日期的问题