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