Java EE 8の新機能の1つとして、Bean Validation 2.0(JSR 380)があります。


※Java EEとは、Java Platform, Enterprise Editionの略でエンタープライズ・ソフトウェアの標準のことで、Servlet、WebSocket、JSF、validation、EJB、JMSなどさまざまな仕様の集まりの事を指します。

もちろん、その仕様にも対応バージョンがあり、Java EE 7のJSFはバージョンが2.2となりHTML5に対応し、それ以前はHTML5に未対応となっているなど違いがあります。

 

これが分かって何がうれしいのかというと...
Java EE 7に対応したWebLogic(Oracleのアプリケーションサーバのソフトウェア)といったら、Java EE 7に準拠しているのでJSFは2.2が使える、つまり、HTML5対応されているんだ!といった事が分かるようになります。

■それで、Bean Validation で何ができるかというと...
電子メールアドレスを検証したり、数値が正か負かを確認したり、日付が過去か現在かをテストしたり、フィールドが空でないか、またはNullでないかをテストする制約を付けられるようになりました。
また、制約を付ける場所についても広範囲の場所で定義することができるようになり、"型引数への BeanValidation アノテーション対応"されるようになりました。

■組み込みの制約定義の例
@Email
@Positive
@PositiveOrZero
@Negative
@NegativeOrZero
@PastOrPresent
@FutureOrPresent
@NotEmpty
@NotBlank
@NotNull
@Null

制約の定義(どこでアノテーションを付けられるとか、デフォルトのメッセージはなんだ)を確認したい場合は、下記URLを参照
http://beanvalidation.org/2.0/spec/#builtinconstraints

■型引数への BeanValidation アノテーション対応でこんな事ができます!

 <例:変数定義でList型の要素の検証をサポート>
  // 正の整数を格納
  List<@Positive Integer> numbers;

 <例:メソッドの戻り値でEmail形式の文字列の検証をサポート、また、Optionalが付くことにより戻り値がnullもあり得ることになる>
  public Optional<@Email String> getEmail() {
   ...
  }
 

Java EE 8の新機能は、Bean Validation 以外にも多数ありますが、本日はここまで!

10月になり、少し肌寒い季節となってきたので、帰社日は鍋料理を検討。

秋の献立がはじまったとのことなので、毎年お世話になっている比内地鶏きりたんぽ鍋で有名な『神楽坂 あべや』へ。

 

鍋料理コースでバーニャカウダ。

 

串焼き♪

 

きりたんぽ鍋(手を付けた後の写真なので具材が崩れてます・・)

 

やはり寒い季節の鍋料理は格別でした。

来年もまた食べに行きます!

リリースが9月延期になったJava SE 9のメジャー改修ではないけれど、使用頻度が高い改善について記述します。


・コレクションクラスにファクトリーメソッドが追加
・Objectsクラスの変更

■コレクションクラスにファクトリーメソッドが追加
ofメソッドを使うことで簡単にイミュータブル(不変)のコレクションを生成することが可能となります。
List、Set、Mapを使ったコレクションクラスのインスタンス生成のコードが少なくなり、可読性が高くなります。

【List】
(Java SE 8以前)
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("carrot");

(Java SE 9)
List<String> list = List.of("apple", "banana", "carrot");

ただし、Javadocを見るとofメソッドは引数1個から10個までしか用意されていないため、11個以上は配列等で渡す必要があります。

List<String> list = List.of(new String[] {"apple", "banana", "carrot" ...省略... ,"jellybean"});

SetもMapも同様にofメソッドが追加され作成が簡単になります!

【Set】
(Java SE 8以前)
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("carrot");

(Java SE 9)
Set<String> set = Set.of("apple", "banana", "orange");
※これも引数10個までしか用意されていないため、11個以上は配列等で渡す必要あり!

- Mapの場合
キーと値がカンマ区切りで繋がっていく...

(Java SE 8以前)
Map<String, String> map = new HashMap<>();
map.put("001", "appple");
map.put("002", "banana");
map.put("003", "carrot");

(Java SE 9)
Map<String, String> map = Map.of("001", "apple", "002", "banana", "003", "carrot");

Mapの場合は、Map.Entryを作成する簡易メソッドを使った書き方でもOK
Map<String, String> map = Map.ofEntries(entry("001", "apple"),entry("002", "banana"),entry(003, "carrot"));

■Objecstクラスの変更
nullの場合デフォルト値を返すメソッドが追加されました。(Objectsは、Java SE 8から導入)
これによって初期値を設定するだけの分岐がなくなるので可読性が高くなります。

(Java SE 8以前)
String hoge = getHoge(); // 値はNullかもしれない
if (hoge == null) {
  hoge = "default value"; // nullならデフォルト値を設定
}

(Java SE 9)
String hoge = Objects.requireNonNullElse(getHoge(), "default value"); // getHoge()の値がnullなら第二引数が設定

もしくは、

String hoge = Objects.requireNonNullElseGet(getHoge(), () -> "default value by heavy processing");

と書くことができます。

requireNonNullElseGet()を使った場合、第二引数の関数型インターフェースSupplierを使った処理(=getメソッドが呼ばれたときに始めて動作)となるため、
null以外のときは"重い処理"が発生しません。

上記を使うだけでも今までよりもすっきりとしてコード量が少ないソースが記述できそうですね!