String.valueOfの値

ほとんどのJava開発者は、おそらくNullPointerExceptionでいっぱいになっています。私たちのほとんどは、NullPointerExceptionに遭遇する「機会」を減らすために特定のことを行うことの価値を学びました。実際、NullPointerExceptionsの防止または削減専用のWikiページがあります。

潜在的なnullの処理を改善し、より簡単にするための追加の言語サポートを主張する人もいます。これらには、Java SE 7の提案、最適化されたNullチェック、およびNullポインター例外を処理するためのJavaのセマンティクスを変更するKingaDobolyiの論文が含まれます。

NullPointerExceptionの発生を減らすためにすでにかなり簡単に実行できる多くのことの中で、特に簡単に実行できることの1つは、必要に応じてString.valueOf(Object)を適用することです。このString.valueOf(Object)メソッドは、Javadocで生成されたドキュメントに記載されているように、渡されたオブジェクトがnullの場合は「null」を返し、渡されたオブジェクトがnullでない場合は渡されたtoString()呼び出しのnull結果を返します。言い換えれば、nullチェックを行います。ObjectObjectString.valueOf(String)

の使用は、カスタムクラスにメソッドをString.valueOf(Object)実装toStringするときに特に役立ちます。ほとんどのtoString実装はクラスのデータメンバーを文字列形式で提供するためString.valueOf(Object)、自然に適合します。Objectを拡張するクラスに基づくすべてのJavaオブジェクトtoString()は、それが単に親(またはObject)の実装であっても、実装を提供しtoString()ます。ただし、メンバークラスが実装されているtoStringが、メンバー自体がクラスのインスタンスではなくnullである場合、は役に立ちtoString()ません(実際にはNullPointerException、呼び出されたときに結果になります)。

これは、次のサンプルコードで示されています。

StringHandlingExample.java

package dustin.examples; import java.io.IOException; import java.io.OutputStream; import java.util.logging.Logger; /** * Example class demonstrating use of String representations available through * implicit String, toString(), and String.valueOf(). */ public class StringHandlingExample { private static final String NEW_LINE = System.getProperty("line.separator"); /** Using java.util.logging. */ private static Logger LOGGER = Logger.getLogger( StringHandlingExample.class.getName()); /** * Main function for running tests/demonstrations. * * @param arguments Command-line arguments; none anticipated. */ public static void main(final String[] arguments) { printHeader("String representation of direct Strings", System.out); final PersonName personName = new PersonName("Flintstone", null); System.out.println("Person's Name [DIRECT]: " + personName); System.out.println("Person's Name [TOSTRING]: " + personName.toString()); System.out.println("Person's Name [STRING.VALUEOF]: " + String.valueOf(personName)); printBlankLine(System.out); printHeader("String representation of non-null complex object", System.out); final Person personOne = new Person(personName); System.out.println("Person One [DIRECT]: " + personOne); System.out.println("Person One [TOSTRING]: " + personOne.toString()); System.out.println("Person One [STRING.VALUEOF]: " + String.valueOf(personOne)); printBlankLine(System.out); printHeader("String representation of null complex object", System.out); final Person personTwo = new Person(null); System.out.println("Person Two [DIRECT]: " + personTwo); System.out.println("Person Two [TOSTRING]: " + personTwo.toString()); System.out.println("Person Two [STRING.VALUEOF]: " + String.valueOf(personTwo)); printBlankLine(System.out); } public static void printHeader(final String message, final OutputStream out) { final String headerSeparator = "===================================================================="; try { out.write((headerSeparator + NEW_LINE + message + NEW_LINE).getBytes()); out.write((headerSeparator + NEW_LINE).getBytes()); } catch (IOException ioEx) { System.out.println(headerSeparator); System.out.println(message); System.out.println(headerSeparator); LOGGER.warning("Could not write header information to provided OutputStream."); } } public static void printBlankLine(final OutputStream out) { try { out.write(NEW_LINE.getBytes()); } catch (IOException ioEx) { System.out.println(NEW_LINE); LOGGER.warning("Could not write blank line to provided OutputStream."); } } /** * Class upon which to call toString. */ private static class PersonName { private String lastName; private String firstName; public PersonName(final String newLastName, final String newFirstName) { lastName = newLastName; firstName = newFirstName; } /** * Provide String representation of me. * * @return My String representation. */ @Override public String toString() { return firstName + " " + lastName; } } private static class Person { private PersonName name; public Person(final PersonName newName) { name = newName; } /** * Provide String representation of me. * * @return My String representation. */ public String toString() { // Don't use -- leads to compiler time error (incompatible types) //return name; // Don't use -- can lead to runtime error (NullPointerException) //return name.toString(); // It's all good return String.valueOf(name); } } } 

上記のコードを使用しtoStringて、複雑なオブジェクトでのメソッドの構築と、所有するクラスによって呼び出されたときのメソッドの動作を示すことができます。最も関心のある方法は、上記のコードの下部にあります。2つの戻り値は、それらに関連する問題のためにコメントアウトされています。最後の例であるusingString.valueOf(Object)は、複雑なPersonNameオブジェクトがnullであるかどうかに関係なく、実行されるたびに最適に機能するため、コメントアウトされていません。次の3つの画像は、Personオブジェクトの文字列表現のこれらの各プレゼンテーションの出力を示しています。

複雑なオブジェクトからの文字列値-コンパイル時エラー

複雑なオブジェクトからの文字列値toString()-潜在的なランタイムNullPointerException

複雑なオブジェクトからの文字列値String.valueOf()-正常に処理されたヌル

使用String.valueOf(Object)してtoString()実装することは、我々は、多くの場合、使用しているため、特に有益であり得るtoString()デバッグするときの方法を、私たちはこのような場合に必要な最後の事は、我々のデータの現在の状態を確認しようとしているときに発生した別の例外です。もちろん、toString()nullを独自にチェックするメソッドを実装することもできます。さらに良いことに、ToStringBuilderのようなものを使用することもできます。ただし、の可用性String.valueOf(Object)は確かに覚えておく価値のあるものであり、私自身がかなり頻繁に使用しているものです。私たちの多くはString.valueOf(Object)toString()実装を呼び出す前にオブジェクトのnullを明示的にチェックするよりも、一般的に明確であり、はるかに明確なコード行が少ないことに気づきました。

最後に、Stringクラスは多くのオーバーロードされたvalueOfメソッドを提供します。このブログ投稿の焦点となったバージョン(オブジェクトを受け入れる)に加えて、valueOfの他のオーバーロードされたバージョンは、プリミティブデータ型とプリミティブデータ型の配列を受け入れます。

結論

Javaでのnull処理の改善に関して将来何がもたらされるかに関係なく、NullPointerExceptionの不要な(実際にスローされることを望んでいる場合もあります!)発生を減らすために今日実行できる多くの戦術があります。これらの1つは、必要String.valueOf(Object)に応じて使用することです。

追加リソース

  • String.valueOfまたはInteger.toString()?
  • toStringの明示的呼び出しと暗黙的呼び出し
  • String.valueOf()メソッドを使用した文字列の値
  • 数値を文字列に変換する

このストーリー「TheValueof String.valueOf」は、もともとJavaWorldによって公開されました。