JDKとの付き合い方を段階別に整理した

# JDKは既に11まで進んでいます
JDK11が2018/9にリリースされました。みなさん既にインストールされましたか？
これまで慣れてきたOracle版を選んだ人や、初めてOpenJDKをインストールした人それぞれではないでしょうか？
世の中のJavaエバンジェリストの人たちはこぞって、現在選ぶべきJDKをいろんな観点からあげてくれています。これはとても助かる情報です。
そこで本記事ではJDK5とか6をナウで使っている俺たちはどうすればいいの？という声なき声に応えたいと思います。

# Oracle JDKの世代別サポート期間
まず、過去においてOracle JDKのサポート期間はどうであったか？
見ての通り、**リリースの間隔も長ければ保守期間も長い**

- JDK1.4 2000年リリース
- JDK5 2004年リリース　公式アップデート終了　2009年10月
- JDK6 2006年リリース　公式アップデート終了　2013年2月
- JDK7 2011年リリース　公式アップデート終了　2015年4月
- JDK8 2014年リリース　公式アップデート終了　2019年1月
- JDK9 2017年リリース　公式アップデート終了　2018年3月
- JDK10 2018年リリース　公式アップデート終了　2018年9月
- JDK11 2018年リリース　

だが、そんな時間の流れが遅い時代は既に終わっている。しかし、過去の遅い流れの時間の中で過ごしているプロジェクト、チームこそ読んでほしい。

# for文で振り返るJava
## JDK1.4
```java

int[] array = new int[10];
for(int i = 0; i < 10; i++) {
    System.out.println(array[i]);
}
```
2002年当時、Javaは最先端であった。今も1.4で動いているシステムがあるとするならば、JDK11のことを今更気にするのはどうかしている。いつまでも秀丸でJavaを書き続けよう。



## JDK5/6/7
```java

int[] array = new int[10];
for(int i: array) {
    System.out.println(i);
}
```
拡張for文を書くことがステータスだった時代。既存のfor文を意味もなく、リファクタリングといって書き換えていた時代が懐かしい。
JDK5/6/7を使っている人は実は２種類いると分けられると思う。Oracleに金を払っている人とそうでない人だ。
### Oracleにお金を払っている人
**OracleのSustaining Supportを利用している人はJDK11の存在は忘れてOK。**そのシステムはそのJDKでEOSまでやりきろう。
### Oracleにお金を払っていない人
2015年4月にサポートの切れたJDKを使っているということは、恐らくアップデートの意思はないだろう。そのまま、EOSまでやりきろう。**ただし、そのシステムはあと10年は使うと思うのでセキュリティインシデントには気をつけよう。**


## JDK8
```java
int[] array = new int[10];
Arrays.stream(array).forEach(arr -> System.out.println(arr));
```
### Streamを使っていない人
Streamだ。既にfor文を書かずに処理が実行可能だ。これを見て、「これはJavaなのか？」と思う人はJDK11の事を気にする必要はない。そのシステムがEOSを迎えるまであと10年はJDK8で頑張ろう。

### Streamを使っていて、Oracleにお金を払っていない人
ここが一番難しい。恐らく、最初からJDK8で作られた現役バリバリのシステムに違いない。そして、そういう人にオススメしたいのは**もう、Javaのバージョンに縛られるな**。思い切って、Open JDK11への移行を検討しよう。
2019年初めにサポートは切れる。そして、LTSがない現状ではどのJDKでも同じだ。
**「異なるJDKでビルドすると全テストを求められる」とビビってしまうのはわかる。**しかし、既にあなたのアプリケーションで使っている、Apache commonsなどはいつのJDKでビルドされたのを使っているか知っているか？多分、恐ろしく古いはず。
とりあえず、JDK11でビルドして動かしてみよう。
**一つだけ注意しておくと、JDK11はJAVAEE系のライブラリがごっそり削除されている**ので、その部分はmavenかgradleで追加しないといけない。流石にJava8ならビルドツール使っているだろうからそこは簡単に対応できるだろう。


## JDK9/10/11
```java
int[] array = new int[10];
Arrays.stream(array).dropWhile(arr -> array <= 1).forEach(System.out::println);
```
dropWhileを記述しているので、仕様を変えてしまっているが、そこはさておき、Streamに新メソッドが追加されている。Javaもどんどんよくなってきているのだ。この書き方を見てJavaScriptと見分けがつかない人も既に多いだろう。
この段階にいる人は既にJDK11を試しているだろう。それでいい。しかし、ここでも大きく２パターンに別れることになるだろう。

### JDKのリリースに開発体制が追随できる
半年間のJDKリリースタイミングにアプリのリリースが合わせられるアジャイルなチームはぜひJDKのバージョンに付いていってほしい。付いていっても、**お客様になんのメリットもないとは思うが、唯一セキュリティ的な意味では良いのかもしれない**。

### 開発をしている間にJDKが２つぐらい上がってそうなチーム
提案書に明記しよう。**「本開発はJDK11でビルドし、リリースを行います。それ以外のJDKでの動作確認は一切致しません」**

## まとめというか備え
ホラーストーリーも書いているが、何れにしてもJavaをこれからもやる人はJava8時代の書き方を身につけないといけない。いつまでも、for文を書いている人は退場するしかない。
私は以下をとてもお薦めしている。自分でもかなり読み込んだ
Java8スタイルを理解するにはまず読んでおいてほしい

[Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング](https://amzn.to/2zLQfyp)
[Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで](https://amzn.to/2zMDOmd)

そして、Java Webアプリケーションの作り方を大きく変えたSpring Bootでアプリを組んでみる事をお薦めする。何がすごいというのはAutoConfigurationのそれに尽きる。
C#でASP.NETを書いているのかと思わせたり、Angularを書いているのかと錯覚したりする。

おすすめははじめてのSpringBootだが、Ver1と少し古い。Ver2向けの書籍も出ており、読みはしたが、超絶おすすめというわけではない。でも読まないより読んでおいた方が良いので挙げておく。
**なぜかというと、Spring Bootでアプリを作るということはそのお作法に極限まで寄せることだからだ**。コードを書きすぎないためにはフレームワークの仕様をじっくり理解することがまずは大切であるという事を記載しておく。
[はじめてのSpringBoot](https://amzn.to/2zLlolD)
[SpringBoot2入門](https://amzn.to/2y5Vebd)