您是否使用StringUtils.EMPTY
代替""
?
我的意思是无论是作为返回值还是设置字符串变量的值。我并不是说用于比较,因为在那里我们使用StringUtils.isEmpty()
您是否使用StringUtils.EMPTY
代替""
?
我的意思是无论是作为返回值还是设置字符串变量的值。我并不是说用于比较,因为在那里我们使用StringUtils.isEmpty()
当然不是。
常量通常有以下3个用途:
这里没有涉及以上任何一种情况。
我使用StringUtils.EMPTY
来隐藏字面量,并表达return StringUtils.EMPTY
是完全被期望的,应该返回一个空字符串。使用""
会让人误以为""
可以很容易地改变成别的值,而这可能只是个错误。我认为EMPTY
更具表现力。
StringUtils.EMPTY
的表达力比 ""
差。 - bacar不需要,只需使用""
。
字面上的""
非常明确,没有任何误解。我不知道为什么你需要一个类常量来表示这个,但我只能假设该常量在包含StringUtils
的程序包中被广泛使用,而不是使用""
。但这并不意味着你应该使用它。
如果人行道上有一块石头,你并不需要把它扔掉。
我很惊讶有多少人乐意盲目假设“”确实是一个空字符串,并且不(偶然地?)包含Unicode的一些神奇的不可见和无间距字符。为了万物的美好和合宜,请尽可能使用EMPTY。
我想在这里加上我的见解,因为我没有看到任何人谈论String
interning和类初始化:
String
字面值都被interned,使得任何一个""
和StringUtils.EMPTY
都是相同的对象StringUtils.EMPTY
可以初始化StringUtils
类,因为它只有在其静态成员EMPTY
未声明为final
时才会访问(JLS在这一点上非常明确)。然而,org.apache.commons.lang3.StringUtils.EMPTY
是final的,因此不会初始化该类。请参阅有关字符串驻留的相关答案和类初始化,并参考JLS 12.4.1。
StringUtils
类的初始化。因此,由于这个字段被声明为final,访问它不会导致StringUtils
类的初始化。 - Holger我不太喜欢使用它,因为return "";
比return StringUtils.EMPTY
要短。
然而,使用StringUtils.EMPTY的一个优点是,如果你输入return " "
而不是return ""
,你可能会遇到不同的行为(关于是否正确测试空字符串)。
""
,而且我讨厌在代码中多次输入相同的字面字符串,即使只有一次。我宁愿在 Constants.java 中声明常量,而不是在源代码的各个地方重复使用它们。 - xenophōnreturn "";
很丑,我更喜欢使用 StringUtil.EMPTY
(在我的自定义类 StringUtil 中声明,而不是 Apache 的 StringUtils)。 - xenophōn如果你的类除了这个神奇的值以外没有使用commons的其他内容,那么为了这个依赖项而引入它会很遗憾。
StringUtils的设计者大量使用这个常量,这是正确的做法,但这并不意味着你也应该使用它。
我发现在某些情况下,StringUtils.EMPTY
对于可读性很有用。特别是在以下情况下:
Ternary operator eg.
item.getId() != null ? item.getId() : StringUtils.EMPTY;
使用常量可以创建对StringUtils.EMPTY
的引用。否则,如果您尝试每次实例化字符串文字""
,JVM将不得不检查它是否已经存在于字符串池中(它很可能已经存在,因此没有额外的实例创建开销)。使用StringUtils.EMPTY
无疑避免了检查字符串池的必要性。
StringUtils.EMPTY
常量是在编译时解析的。 - Roland IlligStringUtil.EMPTY
是编译时常量,对它的引用会编译为完全相同的字节码,就像直接使用 ""
一样。另外,我不知道三元运算符为什么会有任何区别。它就像任何其他表达式一样。适用于使用或不使用命名常量的任何原因都同样适用于三元运算符。 - HolgerFile.separator
比"/"或"\"更好。但你可以按照自己的喜好来做。你不可能得到像return " ";
这样的错别字。someString.isEmpty()
。 - HolgerStringUtils.EMPTY.equals(someString)
作为空值安全解决方案,但这已经陷入了一个陷阱,因为将null
视为“非空”很少是你想要的,即使在极少数情况下你确实想要这样做,这个表达式也不能告诉读者这是有意为之的。所以,只需写成someString != null && someString.isEmpty()
,以说明你已经考虑了如何处理null
。如果someString
不是String
类型,仍然会得到编译器错误(与equals
不同,它会接受任何类型)。无论如何,如果你的意思是isEmpty
或!isEmpty
,就不要使用equals
。 - undefinedStringUtils.isNotEmpty(..)
即可。StringUtils.isNotEmpty(..)
还会进行空值检查,因此它与与空字符串比较并不完全相同。 - cherouvimnull
?作为 equals
的第二个参数,但结果将是相同的 - false
。 - BozhoisNotEmpty
是 "".equals(…)
的相反,因此,它将像空字符串一样处理 null
,这与与空字符串进行比较是不同的,"".equals("")
→true
,"".equals(null)
→false
,StringUtils.isNotEmpty("")
→false
,StringUtils.isNotEmpty(null)
→false
。如果您只想知道一个字符串是否为空,请使用 string.isEmpty()
,它具有正确的行为,即当它是空字符串时返回 true
,如果字符串为 null
则抛出 NullPointerException
... - Holger
StringUtils.EMPTY
。它明确表示使用空字符串是有意义的,而不是某种懒惰行为(“哦,这需要一个字符串,请传递""
”)。如果有人遇到这段代码,他会在进行更改之前三思而后行。此外,如果StringUtils.EMPTY
被定义为自己的变量,比如MyClass.EMPTY
,更改“空值的表示”将只需要更改一行代码。例如,您可以将其更改为"<empty>"
而不是空字符串""
。但我认为这有点过头了。 - Timmos