我知道,每次键入字符串字面值“”时,字符串池中都会引用相同的string对象。
但是为什么字符串API不包括一个公共静态最终字符串空= "";,所以我可以使用String.Empty引用?
它至少可以节省编译时间,因为编译器知道要引用现有的String,而不必检查它是否已经被创建以供重用,对吗?就我个人而言,我认为字符串字面量的激增,尤其是微小的字符串,在很多情况下是一种“代码气味”。
所以在没有绳子的背后有一个伟大的设计原因。是空的,还是语言的创造者根本不同意我的观点?
我知道,每次键入字符串字面值“”时,字符串池中都会引用相同的string对象。
但是为什么字符串API不包括一个公共静态最终字符串空= "";,所以我可以使用String.Empty引用?
它至少可以节省编译时间,因为编译器知道要引用现有的String,而不必检查它是否已经被创建以供重用,对吗?就我个人而言,我认为字符串字面量的激增,尤其是微小的字符串,在很多情况下是一种“代码气味”。
所以在没有绳子的背后有一个伟大的设计原因。是空的,还是语言的创造者根本不同意我的观点?
当前回答
使用org.apache.commons.lang.StringUtils.EMPTY
其他回答
我知道,每次我输入String字面值“”,相同的String对象在String池中被引用。 没有这样的保证。你不能在应用程序中依赖它,这完全由jvm决定。
或者语言的创造者只是不同意我的观点? 是的。对我来说,这不是什么重要的事。
Apache StringUtils也解决了这个问题。
其他方案的缺点:
isEmpty() -不是空安全的。如果 string为空,抛出NPE Length() == 0 -同样不是空安全的。 也没有考虑到 空格的字符串。 与EMPTY常量的比较- 5月 不是空安全的。空白的问题
Granted StringUtils是另一个可以拖动的库,但它工作得非常好,节省了大量的时间和检查空值或优雅地处理npe的麻烦。
使用org.apache.commons.lang.StringUtils.EMPTY
不要只是说“字符串的内存池以字面形式重用,大小写封闭”。编译器在底层做什么并不是这里的重点。这个问题是合理的,特别是考虑到它所获得的赞成票数。
这是关于对称的,没有它,api就很难为人类使用。众所周知,早期的Java sdk忽略了这条规则,现在为时已晚。下面是我想到的一些例子,你可以随意加入你最喜欢的例子:
BigDecimal。0,但没有AbstractCollection。空的,字符串。空 数组中。List.size() List.add() Set.add()但是Map.put() ByteBuffer.put()还有不要忘了StringBuilder.append() Stack.push()
如果你想与空字符串比较而不担心空值,可以执行以下操作。
if ("".equals(text))
最终,你应该做你认为最清楚的事情。大多数程序员认为""意味着空字符串,而不是某人忘记输入任何内容的字符串。
如果您认为存在性能优势,则应该对其进行测试。如果你认为它不值得自己测试,那就说明它真的不值得。
对你来说,这听起来像是在试图解决一个在15年前设计该语言时就已经解决的问题。