你用StringUtils.EMPTY
代替""
吗?
我的意思是作为返回值,或者设置String变量的值。我不是要进行比较,因为我们在那里使用StringUtils.isEmpty()
Answers:
当然不是。您是否真的认为“”不够清晰?
常量本质上有3个用例:
在此均不适用。
EMPTY
不具有空字符串本身还没有的任何含义。最值得注意的是,它没有说明您为什么决定在特定情况下使用空字符串。命名常量ONE
和假装使用该常量代替值没有什么不同。
我StringUtils.EMPTY
用来隐藏文字,并表达return StringUtils.EMPTY
完全期望的内容,并应该返回一个空字符串,这""
可能导致""
可以轻易更改为其他内容的假设,而这也许只是一个错误。我认为这EMPTY
更具表现力。
StringUtils.EMPTY
少比表现""
。
""
比使用来更具表现力StringUtils.EMPTY
,而您所说的话并没有改变我的想法。我几乎可以相信,开发人员偶尔会错误地写出一个空字符串文字-但是,我将把字符串文字的清晰度视作百万分之一(很容易在测试中找到,希望... )错误,亲自。
令我惊讶的是,有多少人乐于盲目地假设“”确实是一个空字符串,并且不(偶然地?)不包含Unicode的任何出色的不可见和非间距字符。为了爱所有善良和体面的人,请尽可能使用EMPTY。
我将在此处添加两美分,因为我看不到有人在谈论String
实习和类初始化:
String
的Java源代码文字被拘禁,使得任何 ""
与StringUtils.EMPTY
该同一对象StringUtils.EMPTY
可以初始化StringUtils
类,因为它EMPTY
只有在未声明final
静态成员的情况下才访问其静态成员(JLS在该点上是特定的)。但是,由于是 final,因此不会初始化该类。org.apache.commons.lang3.StringUtils.EMPTY
看到一个关于字符串实习相关答案和类初始化,指的是JLS 12.4.1。
StringUtils
类的初始化。
我真的不喜欢使用它,因为return "";
它比短return StringUtils.EMPTY
。
但是,使用它的一个错误好处是,如果键入return " ";
而不是return "";
,则可能会遇到不同的行为(与是否正确测试空字符串有关)。
""
,我讨厌多次键入同一文字字符串,甚至有时仅键入一次。我宁愿在Constants.java中声明常量,但不要在源代码中的任何地方重复它们。
return "";
是丑陋的,我PREFER使用回报StringUtil.EMPTY
(在我自己的类中声明StringUtil,而不是Apache的StringUtils的)。
如果您的班级没有使用其他任何来自公地的东西,那么只为这个神奇的价值而拥有这种依赖将是很可惜的。
StringUtils的设计人员大量使用了此常量,这是正确的做法,但这并不意味着您也应该使用它。
老实说,我都没有太多使用。如果要比较一个空字符串,只需使用StringUtils.isNotEmpty(..)
StringUtils.isNotEmpty(..)
还会执行nullcheck,因此它与与空字符串进行比较并不完全相同。
null
?作为的第二个参数equals
,但结果将相同false
isNotEmpty
与之相反"".equals(…)
,因此,将其视为null
空字符串与将其与空字符串进行比较是不同的,"".equals("")
→ true
,"".equals(null)
→ false
,StringUtils.isNotEmpty("")
→ false
,StringUtils.isNotEmpty(null)
→ false
。如果您只是想知道字符串是否为空,请使用string.isEmpty()
,如果字符串为空,则返回正确的行为,如果字符串为… true
,则抛出aNullPointerException
null
我发现StringUtils.EMPTY
在某些情况下有助于提高可读性。特别是:
三元运算符,例如
item.getId() != null ? item.getId() : StringUtils.EMPTY;
同样通过使用常量,StringUtils.EMPTY
创建对的引用。否则,如果您""
每次尝试实例化String文字时,JVM将不得不检查它是否已经存在于String池中(这很可能会存在,因此不会产生额外的实例创建开销)。当然StringUtils.EMPTY
可以避免检查字符串池吗?
StringUtils.EMPTY
在编译时解析常量。
StringUtil.EMPTY
是编译时常量,因此对其的引用将被编译为与""
直接使用相同的字节码。而且,我不明白为什么三元运算符应该有所作为。这是任何其他表达方式。使用或不使用命名常量的任何原因同样适用于三元运算符。
不,因为我还有很多要写的。而一个空字符串是plattform独立空(在Java中)。
File.separator
比“ /”或“ \”好。
但是随你便吧。你不会像错字return " ";
someString.isEmpty()
。
是的,这很有道理。这可能不是唯一的方法,但是我说这种“没有道理”的方式很少。
在我看来:
It will still require changing everywhere if you don't define your own variable and use it in multiple places.
您要将一个空字符串更改为另一个空字符串?
StringUtils.EMPTY
。清楚地表明,使用空字符串是有意的,而不是某种懒惰(“哦,这需要一个字符串,让我们通过""
”)。如果有人点击了这段代码,在进行更改之前,他会三思而后行。另外,如果StringUtils.EMPTY
将其定义为您自己的变量(如)MyClass.EMPTY
,则对“空虚的表示”进行更改将需要更改一行代码。例如,您可以将其更改为"<empty>"
代替空的String""
。但是,我认为这有点太过分了。