StringUtils.EMPTYは推奨されますか?


91

StringUtils.EMPTY代わりに使用します""か?

つまり、戻り値として、またはString変数の値を設定した場合です。比較するつもりはありません。StringUtils.isEmpty()

回答:


107

もちろん違います。「」は十分に明確ではないと思いますか?

定数には基本的に3つの使用例があります。

  1. 値の意味を文書化する(定数名+ javadocを使用)
  2. 共通の値でクライアントを同期します。
  3. いくつかの初期コストを回避するために、特別な値へのショートカットを提供します

ここでは適用されません。


33
のマイナーでまれな使用例が1つまだありますStringUtils.EMPTY。空の文字列の使用が意図されたものであり、ある種の遅延ではないことを明確にします(「これは文字列が必要です、渡しましょう""」)。誰かがこのコードに当たった場合、変更を加える前によく考えます。また、StringUtils.EMPTYなどの独自の変数として定義されている場合、MyClass.EMPTY「その空の表現」に変更を加えるには、コードの1行を変更する必要があります。たとえば、"<empty>"空のStringの代わりに変更でき""ます。しかし、これは少し行き過ぎだと思います。
Timmos 2014年

5
最後に、毎回自分で考えるのではなく、熱心な人に転送するための正気な議論があります。ありがとう。
Alex

2
EMPTYにはどのような意味がないのですか?EMPTYは、リストの1と2の両方を満たします。経験豊富な開発者は、ジュニア開発者が ""を使用するような単純なものを台無しにする可能性をかなり過小評価しています。
Andrew T Finnell、2018

4
@AndrewTFinnell名前にEMPTYは、空の文字列自体にはない意味はありません。特に、その特定のケースでなぜ空の文字列を使用することにしたのは文書化されていません。定数に名前を付けてONE、値の代わりにその定数を使用することに意味があると偽ることは変わりません。
Holger

6
「」が十分に明確ではないと思うので、反対票を投じます。空になりますか?奇妙な「見えない」文字はありますか?
ダンレイソン2018

59

StringUtils.EMPTYリテラルを非表示にし、それreturn StringUtils.EMPTYが完全に予期されていて、空の文字列が返されるはずであることを表現するためにを使用すると、簡単に別のものに変更でき、これはおそらく間違いで""あるという仮定につながる可能性""があります。EMPTYより表現力があると思います。


37
これを提案した他の人のように:0にはZEROを、1にはONEも使用しますか?
Jon Skeet、2010年

9
特別な「空の」ケースを整数リテラルの使用と比較しません。
Christopher Klewes、2010年

16
私が見つけStringUtils.EMPTY 少ないより表現力""
bacar 2013

1
@JonSkeet敬意を表します。私はあなたがここで間違っているように感じます。あなたと私がこれに遭遇することは決してないかもしれませんが、開発者がそれを台無しにした場合の構文チェックを提供しないので、リテラル ""を使用しないようにされる場合があります。そして、はい、私はジュニア開発者が「」のような単純なものを台無しにするのを見てきました。EMPTYを「」以外の意味に変更するという考えには賛成しません。EMPTYの考え方は、コンパイラーがその意味を理解できるという事実だけが好きです。
Andrew T Finnell、2018

@AndrewTFinnell:「不正解」とは、主観的なものでなければならないことを表す奇妙な用語です。いいえ、EMPTYが意味を変えることはないと思いますが、私は-bacarのように- ""を使用するよりも表現力がStringUtils.EMPTYあり、あなたの言ったことは私の考えを変えていません。開発者が空の文字列リテラルを非常にまれに誤って書き込んだと私は信じることができます。 )個人的にはバグ。
Jon Skeet

29

いいえ、使用します""

文字通り""水晶のようにはっきりしています。何を意味するのかについて誤解はありません。そのためにクラス定数が必要になる理由はわかりません。この定数はのStringUtils代わりにを含むパッケージ全体で使用されていると想定することができます""。ただし、それを使用する必要があるわけではありません。

歩道に岩がある場合は、投げる必要はありません。


6
「歩道に岩がある場合、それを投げる必要はありません。」それを私の6歳の息子に伝えてください。
roel

14

「」は確かに空の文字列であり、(誤って?)Unicodeのすばらしい非表示の非スペーシング文字が含まれていないと盲目的に思い込んでいる人がどれほど多くの人に喜んでいるかに驚いています。善良なものすべてを愛するために、できる限りEMPTYを使用してください。


4
私は好奇心が強い-これがコードで発生するのを見たことがありますか?もしそうなら、それは偶然でしたか、それとも故意でしたか?誤って行うのは難しいように思われ、意図的に、空ではないEMPTY定数を使用して独自のStringUtilsクラスを簡単に作成し、それを参照することもできます。
Ian Robertson

5
@IanRobertsonはい、私はこれが起こるのを見てきました。実際にはかなり頻繁に。人々は常にウェブサイトから切り取り、あるコードセットから別のコードセットに貼り付けます。古いコードセットを使用するClear Caseをまだ使用している会社もあり、それは盲目的にWindows ISOセットに変換され、Gitに移行するとUTF-8に変換されます。コードセットの問題を修正するために数え切れないほどの時間を費やしてきました。これを含む。
Andrew T Finnell、2018

3
@AndrewTFinnell私は確かに一般的に、それが問題を引き起こす可能性がある方法を見ることができます。しかし、空ではない空のように見える文字列定数を具体的にどのくらいの頻度で見ましたか?
Ian Robertson

13

Stringインターンとクラスの初期化について話している人がいないので、ここに2セントを追加します。

  • すべてのStringJavaソース内のリテラルは、抑留作っている任意の ""同じオブジェクトStringUtils.EMPTY
  • 宣言されていない場合にのみ静的メンバーにアクセスするため、StringUtils.EMPTY canを使用するとStringUtilsクラス初期化できます(JLSはその時点で固有です)。ただし、これ最終的なものであるため、クラスを初期化しません。EMPTY finalorg.apache.commons.lang3.StringUtils.EMPTY

JLS 12.4.1を参照して、文字列のインターニングクラスの初期化に関する関連する回答を参照してください。


「finalと宣言されていない場合のみ」。このフィールドはfinalと宣言されているため、このフィールドにアクセスしてもクラスの初期化は行われませんStringUtils
Holger、

@Holgerは一般的なステートメントでしたが、実際、javadocへのリンクを使用して編集し、それが最終版であることを示しています(したがって、クラスを初期化しません)。
Matthieu

8

return "";より短いので、私はそれを実際に使用するのは好きではありませんreturn StringUtils.EMPTY

ただし、これを使用することの1つの誤った利点は、のreturn " ";代わりに入力するとreturn "";、(空の文字列を正しくテストするかどうかに関係なく)異なる動作が発生する可能性があることです。


13
これが実際に問題であることを確認したことがありますか(「」を誤って「」の意味で使用している)。個人的に私は文字通りより読みやすく、それが私に問題を引き起こすことは決してありません。
Jon Skeet、2010年

2
@ジョンいいえ、確かに、私はそれを使用する利点を見つけようとしました;)
Romain Linsolas

1
等時ルールはありません。利点がない場合、利点はありません。
エリックロバートソン

1
私も好きでは""ありません。同じリテラル文字列を複数回入力するのは、たまに一度だけでも嫌です。Constants.javaで定数を宣言したいのですが、ソースコードのすべての場所で定数を繰り返すのではありません。
2018

2
私はTHINK return "";醜いです、私が好むリターンを使用するようにStringUtil.EMPTY(自分のクラスで宣言さStringUtil、NOT ApacheののStringUtils)。
2018

5

クラスがコモンズの他のものを使用しない場合は、この魔法の値のためだけにこの依存関係があるのは残念です。

StringUtilsの設計者はこの定数を多用していますが、これは正しいことですが、それを使用する必要があるという意味ではありません。


著者がこの方法を選択したため、これは許容できることを意味しました(「マジックバリュー」の使用は避けてください)。ただし、プライベートにする必要があります。
cherouvim

作成者はコードで0を頻繁に使用します。彼らにとっても定数ZERO = 0を定義する方が良いでしょうか?そうでない場合、違いは何ですか?
Jon Skeet、2010年

6
状況によります。これがFCKEditorStringUtilsの場合、EMPTYは「<p>&nbsp </ p>」となり、クラス内のすべての場所でこの魔法の値を複製するのではなく、EMPTYを再利用したいと思います。したがって、EMPTYとは、EMPTY_STRINGではなくEMPTY_CONTENTを意味します(したがって、ZEROの例は少し不公平です)。ERROR_VISA_INVALID = 0定数を再利用しませんか?
cherouvim

1

正直なところ、どちらもあまり使われていません。空の文字列と比較したい場合は、StringUtils.isNotEmpty(..)


2
StringUtils.isNotEmpty(..)また、nullcheckを実行するため、空の文字列と比較することとはまったく同じではありません。
cherouvim 2010年

そして、あなたはどのようにカンパレしnullますか?の2番目の引数としてequals、ただし結果は同じになりますfalse
Bozho

isNotEmptyはの反対な"".equals(…)ので、null空の文字列のように処理されるという事実、空の文字列比較するのと異なります、"".equals("")true"".equals(null)falseStringUtils.isNotEmpty("")falseStringUtils.isNotEmpty(null)false。あなただけの文字列が空で、使用であるかどうかを知りたい場合はstring.isEmpty()帰国の権利行動持って、trueそれが空の文字列である場合に限っと投げNullPointerException文字列がある場合null...
ホルガー

1

StringUtils.EMPTY読みやすくするために役立つ場合があります。特に:

  1. 三元演算子。

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
  2. メソッドから空の文字列を返します。そうであることを確認するため、私は本当にそうしたいと思っていました。

また、定数を使用することにより、への参照StringUtils.EMPTYが作成されます。それ以外の場合""、JVMが文字列リテラルをすでに文字列プールに存在するかどうかを確認する必要があるたびに文字列リテラルをインスタンス化しようとする場合(そうなる可能性が高いため、追加のインスタンス作成オーバーヘッドはありません)。確かに使用StringUtils.EMPTYすると、文字列プールをチェックする必要がなくなりますか?


4
複数のルックアップを持つあなたの議論は成り立たない。Java言語仕様3.0の第13.4.9章では、StringUtils.EMPTY定数はコンパイル時に解決されると記載されています。
Roland Illig 2014年

4
文字列プールの存在は、実行時ではなく、コンパイル時とクラスの読み込み時にチェックされます。そのようなステートメントを実行するたびに
Marquis of Lorne

1
ので、StringUtil.EMPTYコンパイル時定数であり、それへの参照を使用するのとまったく同じバイトコードにコンパイルされます""直接。さらに、なぜ三項演算子が違いを生むのかわかりません。他と同じような表現です。名前付き定数を使用する、または使用しない理由は、3項演算子にも適用されます。
ホルガー、

1

いいえ、もっと書く必要があるので。そして、空の文字列plattform独立しており、空(Javaで)。

File.separator 「/」または「\」よりも優れています。

しかし、好きなようにしてください。あなたはのようなタイプミスを得ることができませんreturn " ";


7
ほとんどのプログラマーが「多すぎる」と書くことをそれほど恐れている理由がよくわかりません。StringUtils.EMPTYを記述することにより、自己コメントコードを実現できます。また、Steve McConnell(または彼がCode Complete 2.0で引用したいくつかの研究)によると、コードは読み取られた回数の7倍以上読み取られます。
パヴェルDyda

1
あなたは特に正しいですが、 ""。equals(someString)はStringUtils.EMPTY.equals(someString)と同じくらい読みやすいです
Christian Kuetbach

StringUtils.EMPTY.equals(someString)を誤って書き込むと、構文エラーが発生します。"" .equals(someString)はできません。これがEMPTYを使用する必要がある唯一の理由です。
Andrew T Finnell、2018

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.空の文字列を別の空の文字列に変更しますか?
ピタ

@ピタ申し訳ありませんが、それは言い回しが悪かったです。「」の代わりにこのインラインを使用しても、独自の定数を定義して複数の場所で再利用するのと同じ利点は得られないことを意味します。これはStringUtils.EMPTYの引数ではありません。「理にかなっている」としても多くは得られないという説明です。個人的には、わかりやすい名前で定数を作成してから、これを割り当てます。開発者が単一のスペースを意図していて、このフォームでは発生しない空の文字列で終わったいくつかのケースを見てきました。
オロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.