バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

公開日: : プログラム ,

Web アプリのバリデーションチェックにアノテーションを使うことが増えた。だが、アノテーションで実装しにくい場合や、簡単なチェックならアノテーションを使わないでロジックを組むことはまだまだある。

そういう場合、これまでは if を使ってチェック処理の結果を確認してきたが、Java8 で導入された Optional を使って実装してみた。

以下のように、チェック処理結果の確認に if を使っていたのを

String message = validateIf("hoge");
if(message != null) {
  // xxx
}

Optional#ifPresent() にしてみた。

validateOptional("hoge").ifPresent(xxx);

単純に置き換えただけだが、目先が変わって今後の何かのヒントになるかもしれない。
コード例をメモしておく。

icatch-2015-006-1

目次

1. Optional を使ったバリデーションチェック例

値が null かどうかをチェックするバリデーションチェックを例とする。

public Optional<String> validate(final String value) {
    if (value == null) {
        return Optional.of("値が入力されていません");
    }
    return Optional.empty();
}

validate()Optional を返すので、呼び出し側のコードは次のようになる。

List<String> message = new ArrayList<>(); // エラーメッセージを格納するリスト

// 1つ目の要素 → null なのでエラーになる
sut.validate(null).ifPresent(message::add);

// 2つ目の要素 → null ではないのでエラーにならない
sut.validate("1234").ifPresent(message::add);

先にも書いたが、Optional#ifPresent() に置き換わっただけだが、
行数が減ったからなのか、if がなくなったからなのか少々スッキリしているように見える。

やはり null を返す可能性がある場合は積極的に Optional を使ってみよう。

2. String を返すバリデーションチェック例

比較として、バリデーションチェックメソッドが String を返す場合の呼び出し側のコードを載せておく。

List<String> messages = new ArrayList<>();

// 1つ目の要素 → null なのでエラーになる
String message1 = sut.validate(null);
if (message1 != null) {
    messages.add(message1);
}

// 2つ目の要素 → null ではないのでエラーにならない
String message2 = sut.validate("1234");
if (message2 != null) {
    messages.add(message2);
}

3. 更新履歴

  • 2015/10/17: 初版作成

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

icatch-vacuum_9060011568_mini-thumbnail

GitHub にアップされているブランチをローカルに取り込む

GitHub に限らず、会社や自分で Git のサーバを使った場合にも当てはまりますが、毎回同じこと

記事を読む

icatch-8587724648_24926df337_z-resized

yum のリポジトリ ATrpms を参照できるように設定する

あるツールの動作検証をしようと調べたところ、そのツールは ATrpms リポジトリが提供しているとの

記事を読む

no image

CVS でタグ間で変更があったファイルを抽出するスクリプト

今どきバージョン管理ツールに CVS を使っているところは珍しいと思うし、あまり需要はないだろうけど

記事を読む

icatch-medium_4301351732-resized

mp3splt を実行して “undefined symbol: mp3splt_u_check_if_directory” と出力されたときの対処法

mp3 ファイルを分割してくれる mp3splt というライブラリがあります。 mp3 ファイルを

記事を読む

icatch-2015-005-1

ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。 正常系テストの場合: 正

記事を読む

icatch-9214710040_822a4c3456_z-resized

ロードアベレージを監視するシェルスクリプトを作成してみた

このブログを運用している Linux サーバの負荷が高い状態になってました。 何か被害にあったとかで

記事を読む

no image

VPS に Redmine を設置したときに対処したトラブル

Redmine のインストール自体は Redmine 2.3をCentOS 6.4にインストールする

記事を読む

icatch_5428744075-resized

scp を使ってファイルのコピーを実行したら “command not found” と表示されたときの対処法

CentOS が起動しているサーバに scp を使ってファイルをコピーしようとコマンドを実行したら

記事を読む

icatch-2015-003-1

Vagrantで起動したCentOS上のMySQLにホストOSからログインする設定

マシンを新しくしたこともあり、検証と称してソフトウェアをやみくもにインストールすることに抵抗が出てき

記事を読む

icatch-thumbup_3507728739_mini-thumbnail

Sublime Text3 に SublimeLinter-jshint をインストールしてみた

エディタに Eclipse を使って Java のプログラムを書くことが多いんですが、JavaScr

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


六 − = 4

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑