为什么Java中没有String.Empty?

我明白,每次我键入string文字"" ,在string池中引用相同的string对象。

但为什么不包含一个public static final String Empty = ""; ,所以我可以使用对String.Empty引用?

这会节省编译时间,至less编译器会知道引用现有的string,而不必检查它是否已被创build以供重用,对吗? 我个人认为,在很多情况下,string文字(特别是小string)的泛滥是一种“代码味道”。

那么,在没有String.Empty的背后是否还有一个伟大的devise原因,还是语言创作者根本不愿意分享我的观点?

String.EMPTY是12个字符, ""是两个,他们都会在运行时引用完全相同的内存实例。 我不完全确定为什么String.EMPTY会节省编译时间,事实上我认为这将是后者。

特别是考虑到String是不可变的,它不像你可以先得到一个空的String,然后对它执行一些操作 – 最好使用StringBuilder (或StringBuffer如果你想成为线程安全的)并将其转换为String。

更新
从你的评论到问题:

什么启发这实际上是TextBox.setText("");

我相信在适当的课堂上提供一个常数是完全合法的:

 private static final String EMPTY_STRING = ""; 

然后在你的代码中引用它

 TextBox.setText(EMPTY_STRING); 

至less你明白你想要一个空string,而不是忘记在IDE中填写string或类似的东西。

org.apache.commons.lang.StringUtils.EMPTY

如果你想与空string比较而不用担心空值,你可以做以下的事情。

 if ("".equals(text)) 

最终你应该做你认为最清楚的事情。 大多数程序员假定“”意味着空string,而不是某个人忘记放入任何东西的string。

如果你认为有一个性能优势,你应该testing它。 如果你不认为它是值得自己testing的,那么它是一个很好的指示,它真的不值得。

这听起来像是你试图解决一个在15年前devise语言时解决的问题。

Apache的StringUtils也解决了这个问题。

其他选项的失败:

  • isEmpty() – 不是null安全的。 如果string为空,则抛出一个NPE
  • length()== 0 – 再次不是null安全的。 也不考虑空白string。
  • 与EMPTY常量比较 – 可能不是null安全的。 空白问题

授予的StringUtils是另一个库拖动,但它工作得很好,节省了时间和麻烦检查空值或优雅地处理NPE的麻烦。

如果你真的想要一个String.EMPTY常量,你可以在你的项目中创build一个名为“Constants”的实用程序静态final类。 这个类将保持你的常量,包括空string…

在同样的想法中,你可以创buildZERO,ONE int常量……这些在Integer类中不存在,但是就像我所说的那样,写和读会是一个痛苦:

 for(int i=Constants.ZERO; ...) { if(myArray.length > Constants.ONE) { System.out.println("More than one element"); } } 

等等。

所有这些文字都是同一个对象。 为什么使所有这些额外的复杂? 键入的时间较长,不太清楚(编译器的成本很低)。 由于Java的string是不可变的对象,除了可能是一个有效的东西外,从来没有任何需要区分它们,但是空string文字并不是什么大不了的事情。

如果你真的想要一个EmptyString常量,就自己动手。 但是它所要做的只是鼓励更详细的代码; 这样做永远不会有任何好处。

我明白,每次我键入stringstring“”,在string池中引用相同的string对象。
没有这样的保证。 在应用程序中你不能依赖它,完全取决于jvm的决定。

还是语言创作者根本不分享我的观点?
是的。 对我来说,这似乎是非常低的优先事项。

要增加诺埃尔M所说的,你可以看看这个问题,这个答案表明这个常量被重用。

http://forums.java.net/jive/message.jspa?messageID=17122

string常量总是被“interned”,所以实际上并不需要这样的常量。

 String s=""; String t=""; boolean b=s==t; // true 

对于那些声称""String.Empty是可以互换的,或者""更好,你是非常错误的。

每次你做一些像myVariable =“”; 你正在创build一个对象的实例。 如果Java的String对象有一个EMPTY公共常量,那么只有一个对象“”的实例

例如: –

 String.EMPTY = ""; //Simply demonstrating. I realize this is invalid syntax myVar0 = String.EMPTY; myVar1 = String.EMPTY; myVar2 = String.EMPTY; myVar3 = String.EMPTY; myVar4 = String.EMPTY; myVar5 = String.EMPTY; myVar6 = String.EMPTY; myVar7 = String.EMPTY; myVar8 = String.EMPTY; myVar9 = String.EMPTY; 

10(11包括String.EMPTY)指向1个对象

要么: –

 myVar0 = ""; myVar1 = ""; myVar2 = ""; myVar3 = ""; myVar4 = ""; myVar5 = ""; myVar6 = ""; myVar7 = ""; myVar8 = ""; myVar9 = ""; 

10个指向10个对象的指针

这是低效的,在整个大型应用程序中,可能是重要的。

也许Java编译器或运行时足够高效,可以自动将“”的所有实例指向同一个实例,但不一定需要额外的处理才能做出决定。