web-dev-qa-db-ja.com

Java Stringに静的な文字列操作メソッドがないのはなぜですか?

Javaデザイナが_Java.lang.String_クラスに文字列操作メソッドの静的バージョンを作成しなかったのはなぜですか?次のメソッドは私が参照するものですが、質問はクラスの他の非静的メソッドにも拡張できます。

_concat(String)                        substring(int, int)
replace(char, char)                   toLowerCase()
replace(CharSequence, CharSequence)   toLowerCase(Locale)
replaceAll(String, String)            toString()
replaceFirst(String, String)          toUpperCase()
split(String)                         toUpperCase(Locale)
split(String, int)                    trim()
substring(int)
_

これらのメソッドの非静的バージョンのみを使用すると、そのようなメソッドを呼び出さなければならない場所でexplicit nullチェックが強制されます。たとえば、単にexample = example.trim()を呼び出すと、_String example = null_の場合、NullPointerExceptionになります。したがって、プログラマーは次のボイラープレートnullチェックを実行する必要があります。

_if (example != null)
    example = example.trim();
// OR:
example = (example==null) ? null : example.trim();
example = (example==null) ? null : example.substring(5);
_

Stringにこれらのメソッドの静的バージョン(おそらくexclusively)があると、はるかに便利になると思います。最初の引数としての入力文字列:

_example = String.trim(example);
example = String.replace(example, 'a', 'b');
example = String.substring(example, 5);
_

これにより、プログラマーが明示的にnullケースを処理するのではなく、nullを返すだけでnullケースを自動的に処理する、よりクリーンなコードがプログラマーによって作成されます。 nullを返すことは、null文字列を操作する必要があるため、私にとって意味がありますエラーではなく、null文字列になります。

なぜしなかったのか Javaデザイナーは、Java 1またはJava 2でStringクラスを設計したときにこれを考えましたまたは、そのような機能を後のJavaバージョンに追加しますか?

17
ADTC

Null文字列を操作するとエラーではなくnull文字列になるはずなので、nullを返すことは私にとって意味があります。

まあ、それはあなたの意見です。他の人は、文字列を含まないnullオブジェクトでの文字列操作は意味をなさないため、例外をスローするべきだと主張するかもしれません

なぜ「Javaデザイナ」が何かをしたか、しなかったかは、答えるのが難しいです。

Nullセーフな文字列操作を実行できるライブラリはすでに存在します。 StringUtils Apache Commonsの。必要な場合は、そのライブラリまたは類似のライブラリを使用できます。


コメントに基づく追加

コメントを読むと、あなたが直面している本当の問題は、コード全体でnullをチェックする必要があることです。これは、インターフェイス間の契約が明確に定義されていない場合、プログラム設計が不適切であることを示す可能性があります。あなたは読みたいかもしれません Javaで「!= null」ステートメントを回避しますか?

30
Uooo

IMOは、メソッドを作成するための「if arg is null return null」アプローチ全体を不必要にプログラムの循環的複雑度を増加させます。

初期のJava libsはnullを返すアプローチを使用していましたが、JDKの連中は常に例外を除いてnullから守っていました。

時が経てば、後者のアプローチが明確な勝者として出てきたと思います。

どうして? nullフィールドはooの原則の多くを破るので。それらをポリモーフィッククラスのメンバーとして扱うことはできません。これは、常にnullの特殊なケースをコーディングする必要があることを意味します。そのため、物事がnullであると想定しなければならないときに、循環的複雑度が急上昇します。

問題を解決するには、nullフィールドに依存するのではなく、nullオブジェクトパターンの使用を検討してください。

10

これは理由ではありませんが、toStringを除いて、これらのメソッドはすべて静的ヘルパークラスに簡単にカプセル化できますが、その逆は当てはまりません。

つまりStings.toUpper(string input)が必要な場合、そのコードは簡単に記述できますが、instance.toUpperが必要で、すべてがString.toUpperである場合、それは不可能です...拡張メソッドを導入しない限り、おそらくその時点でさえ考慮されていませんでした。

3
jmoreno