Javaで Long 型を String 型に変換する際、通常の toString() メソッドを用いると、もしその Long が null だった場合に NullPointerException が発生してしまうことがあります。
このようなケースを安全に扱うため、Java標準ライブラリの Objects クラスが提供する toString(Object o, String nullDefault) メソッドを活用する方法をご紹介します。
このメソッドを使えば、null の時に返すデフォルト文字列をあらかじめ指定できるため、例外を防ぎつつ意図した文字列変換を行うことができます。
なぜ通常の変換が問題になるのか?
例えば次のようなコードを考えます:
value が null の場合、value.toString() は実行できず例外になります。
また、String.valueOf(value) を使う手もありますが、value が null の際には "null" という文字列が返されるだけで、「空文字」や「0」など別のデフォルト値を返したい場合には少し不便です。
その点、 Objects.toString() を使うと、次のように記述できます:
このように書くことで、value が null の場合に ""(空文字)を返すように明示できます。
Objects.toString() の使い方
メソッド概要
-
public static String toString(Object o)
– 引数oがnullでないならo.toString()を返し、nullの場合"null"を返します。 Oracle Docs+1 -
public static String toString(Object o, String nullDefault)
– 引数oがnullでないならo.toString()を返し、nullの場合にnullDefaultを返します。 Oracle Docs+1
長所
-
nullであっても例外を起こさず、安全に文字列変換できる -
null時に返す文字列を任意に指定できるため、要件に応じた挙動(空文字・「不明」・「0」など)にできる -
可読性の高いコードになる(いちいち三項演算子で
((value != null) ? value.toString() : "")と書かなくても済む)
短所・注意点
-
引数が
nullの場合に"null"を返す第一バージョンを使うと、意図せず"null"が画面やログに出てしまう可能性あり -
toString()のオーバーライドにより、実際の文字列表現が想定と異なる場合もある(設計に注意) -
フィールドが
nullかどうかチェックせずにtoString()を呼び出してしまうと、やはり例外になる(あくまでObjects.toString()がnullオブジェクト自身を安全に扱うわけで、フィールド内部がnullだと別途対策が必要)
サンプルコード(JUnitを用いたテスト例)
以下に、Long 型を String に変換する例を示します。特に null のケースも含めてテストしています。
このように書くと、
-
longValue = 123Lのとき →"123" -
longValue = nullのとき(引数なし版) →"null" -
longValue = nullのとき(第二引数あり版) →""(空文字)
という挙動になります。
実践上の応用・ベストプラクティス
-
文字列変換した結果をそのまま画面表示やログに出すケースでは、
nullをそのまま"null"と表示するのはあまり望ましくありません。空文字にするか、「未設定」など適切な文言を返すように設計するとユーザービリティが向上します。 -
複数のフィールドを含むクラスの
toString()をオーバーライドする際、各フィールドについてObjects.toString(field, "<デフォルト>")を使うことで、null安全かつ可読性を確保できます。 -
デフォルトの
toString()(つまりObject#toString())をそのまま使うと、クラス名+ハッシュコードのようなあまり意味のない文字列になるため、ログ出力やデバッグ目的では専用にtoString()を実装しておくのが望ましいです。 Stack Overflow+1 -
もしも
LongをStringに変換した結果を数値演算などに再利用する可能性があるなら、変換過程でnullを"0"に置き換えるか、あるいはOptional<Long>やlongのプリミティブ型(0値)を使うことも検討すべきです。 -
プリミティブ型
longと参照型Longの違い(nullを許すかどうか)を理解したうえで、参照型を使うなら常にnullチェックを意識しましょう。
まとめ
-
Long型からString型への変換では、nullを考慮しないと例外や意図しない"null"表示が発生する可能性があります。 -
Java標準の
Objects.toString(Object o, String nullDefault)を使えば、nullの場合に返す文字列を明示でき、安全に文字列に変換可能です。 -
複数フィールドを持つモデルの
toString()実装時や、ユーザーに表示する文字列生成時には、この手法を取り入れることで可読性と堅牢性が向上します。 -
実際の値変換だけでなく、表示/ログ目的での文字列生成やデバッグ用途も含めて、どのような
null措置を行うかを設計段階で検討しておくのがベストです。
