为什么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编译器或运行时足够高效,可以自动将“”的所有实例指向同一个实例,但不一定需要额外的处理才能做出决定。