我最近看到一些代码中的某些东西让我很好奇,如果它实际上有某种优化或性能影响。在常量文件中这是一行:
public static final Object NULL = null;
然后,在整个代码中,不是明确使用null
关键字,而是使用Constants.NULL
引用它。
之前我曾见过这样的事情:
public static final String EMPTY_STRING = "";
......如果它试图避免创建大量重复的""
实例,那么这似乎至少有点意义。但它真的与null
有什么不同,因为它实际上不是任何一种对象吗?有什么我想念的吗?
答案 0 :(得分:4)
两者都没有任何意义。在代码中的多个位置使用""
不会创建String对象的多个实例。除非您显式调用new String("");
,否则JVM只会创建一个字符串池并引用每个特定字符串的一个实例。
答案 1 :(得分:3)
我不认为以这种方式定义和使用NULL
不仅仅会增加噪音。也许编写该代码的人来自C ++背景,并且更喜欢NULL
比null
更熟悉的外观。
第二个例子也值得怀疑,因为多次使用""
不会导致为每次使用创建单独的String
对象。引用JLS:
此外,字符串文字始终引用类
String
的同一实例。这是因为字符串文字 - 或者,更强一些地,作为常量表达式的值的字符串(第15.28节) - 被“实例化”以便使用方法String.intern
共享唯一实例。
答案 2 :(得分:0)
有一个使用Object.NULL的目的。
假设您有一堆验证对象是否为null的代码。因此,作为一项新功能的一部分,在某些情况下为空对象时,您需要使用默认值。
使用简单的if obj!= null,您无法跟踪对象是否针对null进行验证。但是,如果使用obj!= Object.NULL,则可以使用IDE /编辑器来帮助您找到这些用法。
答案 3 :(得分:-1)
由于java中的字符串池概念而占用的内存没有任何差别,并且当使用NULL常量而不是null或EMPTY_STRING而不是“”时,它会使代码看起来更脏。
它们都是自我解释的,因此不需要为它们创建命名常量。