導入
Java開発において、文字列が「空であるか」を判定する処理は最も頻繁に発生する実装の一つです。しかし、Java 11で導入されたisBlank()と、古くからあるisEmpty()のどちらを使うべきか迷うことはありませんか?不適切な判定は、不要な空白データが混入するバグや、バリデーション漏れの原因となります。本記事では、これらを正しく使い分け、堅牢なコードを書くための実践的なTipsを解説します。
基礎知識
まず、それぞれのメソッドの挙動を正しく理解しましょう。
isEmpty()
文字列の長さが0であるか(length() == 0)を判定します。つまり、半角スペースやタブなどの「空白文字」が含まれている場合は、falseを返します。
isBlank()
Java 11から導入されました。文字列が空であるか、または「空白文字のみ」で構成されている場合にtrueを返します。内部的にはCharacter.isWhitespace()を使用して判定されます。
実装/解決策
実務における使い分けの基準は、「その文字列に空白が含まれていても許容するか」にあります。
・isEmpty()を使う場面
ユーザー入力において「スペースも一つの文字として扱う(例:パスワードやコード)」場合や、単に「文字が一つも存在しないこと」を保証したい場合。
・isBlank()を使う場面
名前、住所、メールアドレスなど、人間が入力するフィールドにおいて「スペースのみの入力は無効(実質的に値がない)」と見なしたい場合。現場ではこちらの使用頻度の方が圧倒的に高いはずです。
サンプルプログラム
以下のコードをコピーして動作を確認してみてください。
public class StringValidationExample {
public static void main(String[] args) {
String emptyStr = “”;
String blankStr = ” “; // 半角スペース3つ
String normalStr = ” Java “;
// isEmptyの挙動
System.out.println(“— isEmpty —“);
System.out.println(“空文字: ” + emptyStr.isEmpty()); // true
System.out.println(“空白文字: ” + blankStr.isEmpty()); // false (空白は文字とみなす)
// isBlankの挙動
System.out.println(“\n— isBlank —“);
System.out.println(“空文字: ” + blankStr.isBlank()); // true
System.out.println(“空白文字: ” + blankStr.isBlank()); // true (空白のみは空とみなす)
// 実務でよくあるバリデーション例
String input = ” “;
if (input != null && input.isBlank()) {
// 文字列がnullでなく、かつ実質的に空である場合の処理
System.out.println(“\nエラー: 入力値が空です。”);
}
}
}
応用・注意点
現場で陥りやすい注意点が3つあります。
1. NullPointerExceptionの回避
isBlank()やisEmpty()を呼び出す前に、必ずnullチェックが必要です。モダンな開発では、Apache Commons LangのStringUtils.isBlank(str)を使用すると、nullチェックと空文字判定を一度に行えるため、コードの可読性が向上し安全です。
2. レコード(Records)での利用
Javaのレコード(Record)でバリデーションを行う際、コンストラクタ内でisBlank()を使用すると、インスタンス生成時に不正なデータを弾くことができます。
3. トリム(trim)との違い
かつては「str.trim().isEmpty()」という書き方が一般的でしたが、これは新しいStringインスタンスを生成するためメモリ効率が悪いです。Java 11以降であれば、isBlank()を使用することで、メモリ効率と可読性の両方を向上させることが可能です。
まずはプロジェクトのJavaバージョンを確認し、可能であれば積極的にisBlank()への移行を検討してください。

コメント