是否建议使用StringUtils.EMPTY?


91

你用StringUtils.EMPTY代替""吗?

我的意思是作为返回值,或者设置String变量的值。我不是要进行比较,因为我们在那里使用StringUtils.isEmpty()

Answers:


107

当然不是。您是否真的认为“”不够清晰?

常量本质上有3个用例:

  1. 记录值的含义(常量名称+ javadoc)
  2. 根据通用值同步客户端。
  3. 提供一个特殊值的捷径,以避免一些启动费用

在此均不适用。


33
我仍然看到一个小的和罕见的用例StringUtils.EMPTY。清楚地表明,使用空字符串是有意的,而不是某种懒惰(“哦,这需要一个字符串,让我们通过""”)。如果有人点击了这段代码,在进行更改之前,他会三思而后行。另外,如果StringUtils.EMPTY将其定义为您自己的变量(如)MyClass.EMPTY,则对“空虚的表示”进行更改将需要更改一行代码。例如,您可以将其更改为"<empty>"代替空的String ""。但是,我认为这有点太过分了。
Timmos 2014年

5
最后,我有一些理智的理由将狂热者转发给他们,而不是每次都独自思考。谢谢。
亚历克斯

2
空无意义如何?EMPTY同时满足列表中的1和2。有经验的开发人员严重低估了初级开发人员弄乱像使用“”这样简单的内容的可能性。
Andrew T Finnell '18

4
@AndrewTFinnell该名称EMPTY不具有空字符串本身还没有的任何含义。最值得注意的是,它没有说明您为什么决定在特定情况下使用空字符串。命名常量ONE和假装使用该常量代替值没有什么不同。
Holger

6
投反对票是因为,不,我实际上认为“”不够清晰:(是空白?是空的吗?那儿是否有空格,因为我的字体很小,我看不到吗?是空的吗?有任何奇怪的“看不见的字符”吗?
Dan Rayson

59

StringUtils.EMPTY用来隐藏文字,并表达return StringUtils.EMPTY完全期望的内容,并应该返回一个空字符串,这""可能导致""可以轻易更改为其他内容的假设,而这也许只是一个错误。我认为这EMPTY更具表现力。


37
正如其他建议过的人一样:您是否也将0设为零并将1设为ONE?
乔恩·斯基特

9
我不会将特殊的“空”情况与整数文字的使用进行比较。
Christopher Klewes,2010年

16
我觉得StringUtils.EMPTY 比表现""
bacar 2013年

1
@JonSkeet非常感谢您。我确实觉得您在这里不正确。尽管您和我可能从未遇到过这种情况,但还是有必要不使用文字“”,因为如果开发人员将其弄乱了,它就不会提供语法检查。是的,我已经看到初级开发人员弄乱了诸如“”之类的简单内容。我不接受将EMPTY更改为“”以外的含义的想法。我喜欢EMPTY的想法只是因为编译器能够理解它的含义。
Andrew T Finnell '18

@AndrewTFinnell:“错误”对于一定是主观的东西是一个奇怪的术语。不,我不希望EMPTY会改变含义,但我像bacar一样,""比使用来更具表现力StringUtils.EMPTY,而您所说的话并没有改变我的想法。我几乎可以相信,开发人员偶尔会错误地写出一个空字符串文字-但是,我将把字符串文字的清晰度视作百万分之一(很容易在测试中找到,希望... )错误,亲自。
乔恩·斯基特

29

不,只需使用即可""

文字""清晰如水晶。关于其含义没有任何误解。我不知道为什么您需要一个类常量。我只能假设在包含StringUtils而不是的整个包中都使用了此常量""。不过,这并不意味着您应该使用它。

如果人行道上有一块岩石,则不必扔掉。


6
“如果人行道上有一块岩石,则不必扔掉。” 告诉我6岁的儿子。
roel

14

令我惊讶的是,有多少人乐于盲目地假设“”确实是一个空字符串,并且不(偶然地?)不包含Unicode的任何出色的不可见和非间距字符。为了爱所有善良和体面的人,请尽可能使用EMPTY。


4
我很好奇-您是否曾经在代码中看到这种情况?如果是这样,是偶然还是故意?这似乎很难做到,如果有意的话,我可以轻松地创建一个带有非空EMPTY常量的我自己的StringUtils类,并进行引用。
伊恩·罗伯逊

5
@IanRobertson是的,我已经看到了这种情况。实际上经常。人们一直在从网站上剪切和粘贴,从一个代码集复制到另一个代码集。还有一些公司仍在使用Clear Case,Clear Case使用了一个古老的代码集,然后将其盲目转换为Windows ISO集合,如果您移至Git,则将其转换为UTF-8。我花了无数小时来解决代码集问题。包括这个。
Andrew T Finnell '18

3
@AndrewTFinnell我当然可以看到通常会引起问题的方式。但是,您有多少次专门看到过一个非空的,空的String常量呢?
伊恩·罗伯逊

13

我将在此处添加两美分,因为我看不到有人在谈论String实习和类初始化:

  • 所有String的Java源代码文字被拘禁,使得任何 ""StringUtils.EMPTY同一对象
  • using StringUtils.EMPTY 可以初始化StringUtils类,因为它EMPTY 只有在未声明final静态成员的情况下访问其静态成员(JLS在该点上是特定的)。但是,由于 final,因此不会初始化该类。org.apache.commons.lang3.StringUtils.EMPTY

看到一个关于字符串实习相关答案类初始化,指的是JLS 12.4.1


“仅在未声明为final的情况下”,因此,由于此字段被声明为final,因此访问它不会导致StringUtils类的初始化。
Holger

@Holger是一般性的声明,但实际上,我用指向javadoc的链接进行了编辑,显示它是最终的(因此不会初始化该类)。
Matthieu

8

我真的不喜欢使用它,因为return "";它比短return StringUtils.EMPTY

但是,使用它的一个错误好处是,如果键入return " ";而不是return "";,则可能会遇到不同的行为(与是否正确测试空字符串有关)。


13
您是否曾经观察到这实际上是一个问题(在您意指“”的地方意外地使用了“”)?就我个人而言,我发现该文字更具可读性,并且从未给我造成任何问题。
乔恩·斯基特

2
@Jon,确实,但是我试图找到使用它的好处;)
Romain Linsolas 2010年

1
没有平等的时间规则。如果没有优势,那么就没有优势。
艾里克·罗伯逊

1
我也不喜欢"",我讨厌多次键入同一文字字符串,甚至有时仅键入一次。我宁愿在Constants.java中声明常量,但不要在源代码中的任何地方重复它们。
贾可Jacky '18

2
THINK return "";是丑陋的,我PREFER使用回报StringUtil.EMPTY(在我自己的类中声明StringUtil,而不是Apache的StringUtils的)。
贾可Jacky

5

如果您的班级没有使用其他任何来自公地的东西,那么只为这个神奇的价值而拥有这种依赖将是很可惜的。

StringUtils的设计人员大量使用了此常量,这是正确的做法,但这并不意味着您也应该使用它。


我的意思是可以接受的,因为作者选择了这种方式(避免使用任何“魔术值”)。它应该是私有的。
cherouvim 2010年

作者在代码中经常使用0。对他们来说,定义一个常量int ZERO = 0也更好吗?如果没有,有什么区别?
乔恩·斯基特

6
这取决于上下文。如果这是FCKEditorStringUtils,则它们的EMPTY为“ <p>&nbsp </ p>”,我宁愿看到EMPTY被重用,而不是在类中的任何地方都复制此魔术值。因此,通过EMPTY,它们可能表示EMPTY_CONTENT,而不是EMPTY_STRING(因此您的ZERO示例有点不公平)。您不会重复使用ERROR_VISA_INVALID = 0常量吗?
cherouvim 2010年

1

老实说,我都没有太多使用。如果要比较一个空字符串,只需使用StringUtils.isNotEmpty(..)


2
StringUtils.isNotEmpty(..)还会执行nullcheck,因此它与与空字符串进行比较并不完全相同。
cherouvim 2010年

以及您将如何露营null?作为的第二个参数equals,但结果将相同false
Bozho 2010年

isNotEmpty与之相反"".equals(…),因此,将其视为null空字符串与将其与空字符串进行比较不同的,"".equals("")true"".equals(null)falseStringUtils.isNotEmpty("")falseStringUtils.isNotEmpty(null)false。如果您只是想知道字符串是否为空,请使用string.isEmpty(),如果字符串为空,则返回正确的行为,如果字符串为… true,则抛出aNullPointerExceptionnull
Holger

1

我发现StringUtils.EMPTY在某些情况下有助于提高可读性。特别是:

  1. 三元运算符,例如

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
  2. 从方法返回空字符串,以确认是的,我真的很想这样做。

同样通过使用常量,StringUtils.EMPTY创建对的引用。否则,如果您""每次尝试实例化String文字时,JVM将不得不检查它是否已经存在于String池中(这很可能会存在,因此不会产生额外的实例创建开销)。当然StringUtils.EMPTY可以避免检查字符串池吗?


4
您的带有多个查找的参数不成立。在Java Language Specification 3.0的13.4.9章中,提到了StringUtils.EMPTY在编译时解析常量。
罗兰·伊利格

4
字符串池中的存在是在编译时和类加载时检查的,而不是在您每次执行这样的语句时在运行时检查的,
Lorne Marquis

1
由于StringUtil.EMPTY是编译时常量,因此对其的引用将被编译为与""直接使用相同的字节码。而且,我不明白为什么三元运算符应该有所作为。这是任何其他表达方式。使用或不使用命名常量的任何原因同样适用于三元运算符。
Holger '18年

1

不,因为我还有很多要写的。而一个字符串是plattform独立(在Java中)。

File.separator 比“ /”或“ \”好。

但是随你便吧。你不会像错字return " ";


7
我非常不明白为什么大多数程序员如此害怕编写“太多”的东西。通过编写StringUtils.EMPTY,您将获得自我注释代码,该代码更易于阅读。根据史蒂夫·麦康奈尔(或他在Code Complete 2.0中引用的一些研究)的说法,代码的读取量是编写的7倍。
帕维尔Dyda

1
您特别正确,但是:“” .equals(someString)就像StringUtils.EMPTY.equals(someString)一样容易阅读
Christian Kuetbach,2010年

如果写入不正确,StringUtils.EMPTY.equals(someString)将导致语法错误。“” .equals(someString)不会。这是需要使用EMPTY的唯一原因。
Andrew T Finnell '18

1
@AndrewTFinnell这就是为什么理智的程序员改写someString.isEmpty()
Holger

-2

是的,这很有道理。这可能不是唯一的方法,但是我说这种“没有道理”的方式很少。

在我看来:

  • 它比“”更突出。
  • 它说明您的意思是空的,而空白可能不会。
  • 如果您未定义自己的变量并在多个位置使用它,那么仍然需要在各处进行更改。
  • 如果您在代码中不允许使用免费的字符串文字,那么这会有所帮助。

It will still require changing everywhere if you don't define your own variable and use it in multiple places.您要将一个空字符串更改为另一个空字符串?
皮塔饼

@Pita抱歉,措辞不好。我的意思是说,如果使用此内联而不是“”,则仍然无法获得与定义自己的常量并在多个位置重复使用相同的好处。它不是StringUtils.EMPTY的参数,而是一种解释,即使它“有意义”,您也不会得到多少。就个人而言,我将创建一个具有描述性名称的常量,然后分配该常量。我见过一些情况,开发人员原本打算使用一个空格并以一个空字符串结尾,但这种形式不会发生这种情况。
奥伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.