我有一个同事发誓
//in a singleton "Constants" class public static final String EMPTY_STRING = "";
在整个项目中可用的常量类中.这样,我们可以写出类似的东西
if (Constants.EMPTY_STRING.equals(otherString)) { ... }
代替
if ("".equals(otherString)) { ... }
我说是的
不值得 - 它不会保存堆/堆栈/字符串池中的任何空间,
丑陋
滥用常数类.
谁是这里的白痴?
字符串常量默认实习,所以无论你有多少次是指""代码,将只有一个空的String对象.我没有看到声明EMPTY_STRING有任何好处.否则,你也可以为整数文字声明一个,两个,三个,四个等.
当然,如果你想稍后更改EMPTY_STRING的值,将它放在一个地方很方便;)
为什么你想在Java中使用全局变量?詹姆斯戈斯林真的试图摆脱他们; 请不要带回来.
或
0 == possiblyEmptyString.length()
要么
possiblyEmptyString.isEmpty() // Java 6 only
同样清楚.
我更喜欢看EMPTY_STRING.
它使它成为英语."".equals'读取'与EMPTY_STRING.equals不同.
具有讽刺意味的是,常数的重点是使它们易于改变.因此,除非你的同事计划将EMPTY_STRING重新定义为空字符串以外的东西 - 这将是一件非常愚蠢的事情 - 将一个真正的固定构造(例如"")转换为常量是一件坏事.
正如Dan Dyer所说,它就像将常数定义为1:它完全没有意义,如果有人重新定义它,那将是完全混乱的 - 可能有风险.
好吧,我也可以猜,但我做了一个快速测试...几乎像作弊...
使用各种方法检查任意字符串.(几次迭代)
结果表明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来说,不会有一些糖...