使一个空字符串值得吗?

jac*_*bko 24 java string

我有一个同事发誓

//in a singleton "Constants" class
public static final String EMPTY_STRING = "";
Run Code Online (Sandbox Code Playgroud)

在整个项目中可用的常量类中.这样,我们可以写出类似的东西

if (Constants.EMPTY_STRING.equals(otherString)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

代替

if ("".equals(otherString)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我说是的

  1. 不值得 - 它不会保存堆/堆栈/字符串池中的任何空间,
  2. 丑陋
  3. 滥用常数类.

谁是这里的白痴?

Dan*_*yer 65

字符串常量默认实习,所以无论你有多少次是指""代码,将只有一个空的String对象.我没有看到声明EMPTY_STRING有任何好处.否则,你也可以为整数文字声明一个,两个,三个,四个等.

当然,如果你想稍后更改EMPTY_STRING的值,将它放在一个地方很方便;)

  • 所有"常量表达式"的文字和值都是实体.请参阅JVM规范:http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#20359 (7认同)
  • 他们“总是”被拘留,还是通常如此?您是否保证所有空字符串都等于所有其他空字符串,即使跨类和包边界也是如此? (2认同)
  • 所有空的String*文字*.您可以创建其他不同的String对象,这些对象也是空的. (2认同)

Dou*_*rel 16

为什么你想在Java中使用全局变量?詹姆斯戈斯林真的试图摆脱他们; 请不要带回来.

0 == possiblyEmptyString.length()
Run Code Online (Sandbox Code Playgroud)

要么

possiblyEmptyString.isEmpty() // Java 6 only
Run Code Online (Sandbox Code Playgroud)

同样清楚.

  • 除非possibleEmptyString为null,否则你得到一个NPE (11认同)

小智 7

我更喜欢看EMPTY_STRING.

它使它成为英语."".equals'读取'与EMPTY_STRING.equals不同.

  • 没有理由对此进行修改. (5认同)
  • 但是 `EMPTY_STRING` 可以任意定义。如果我在源代码中遇到这样的事情,我会觉得有必要查看它的定义,尤其是当它不是内置语言时 ;-)。 (2认同)

Dav*_*rno 7

具有讽刺意味的是,常数的重点是使它们易于改变.因此,除非你的同事计划将EMPTY_STRING重新定义为空字符串以外的东西 - 这将是一件非常愚蠢的事情 - 将一个真正的固定构造(例如"")转换为常量是一件坏事.

正如Dan Dyer所说,它就像将常数定义为1:它完全没有意义,如果有人重新定义它,那将是完全混乱的 - 可能有风险.


小智 6

好吧,我也可以猜,但我做了一个快速测试...几乎像作弊...

使用各种方法检查任意字符串.(几次迭代)

结果表明isEmpty()更快,更可读; 如果isEmpty()不可用,则length()是一个不错的选择.

使用常量可能不值得.

"".equals(someString())      :24735 ms
t != null && t.equals("")    :23363 ms
t != null && t.equals(EMPTY) :22561 ms
EMPTY.equals(someString())   :22159 ms
t != null && t.length() == 0 :18388 ms
t != null && t.isEmpty()     :18375 ms
someString().length() == 0   :18171 ms

在这种情况下;

"IAmNotHardCoded".equals(someString())

我建议在相关位置定义一个常量,因为所有常量的全局类真的很糟糕.如果没有相关的地方,你可能做错了什么......

Customer.FIELD_SHOE_SIZE //"SHOE_SIZE"

可能被视为相关的地方;

CommonConstants.I__AM__A__LAZY__PROGRAMMER // true

不是.

对于BigIntegers和类似的东西,我倾向于最终在本地定义一个最终的静态; 喜欢:

private final static BigDecimal ZERO = new BigDecimal(0);
private final static BigDecimal B100 = new BigDecimal("100.00");

多数民众赞成在我身上,对于BigInts和BigDecimals来说,不会有一些糖...


tva*_*son 5

我和你同事在一起。虽然空字符串很难打错,但您可能会不小心在其中输入空格,并且在扫描代码时可能很难注意到。更重要的是,对在多个地方使用的所有字符串常量执行此操作是一种很好的做法 - 不过,我倾向于在类级别而不是作为全局常量执行此操作。

FWIW,C# 有一个静态属性 string.Empty 就是为了这个目的,我发现它极大地提高了代码的可读性。

  • 如果您不使用等宽字体进行编程,那么您就错了。如果是的话,“”和“”之间就有明显的区别。 (2认同)