新人エンジニアがJJUGに行ってみた ~「JavaSE 10/ JDK10リリース特集」(2018/03/26(月))~

# [JJUGナイトセミナー「JavaSE 10/ JDK10リリース特集」(2018/03/26(月))](https://jjug.doorkeeper.jp/events/71974)

## JDKリリースモデルのお知らせ

次回のJava Day Tokyoにて、Mark Reinhold さんが来日、基本講演！。
近日登録サイトオープン!

## JDK新しいリリースモデルのおさらい
- OpenJDK
    - ライセンスモデルはGPLなので無償提供できます。
    - OracleJDKと同じ内容
    - 6ヶ月単位にリリース
    - 3ヶ月単位にパッチリリース
- OracleJDK
    - 有償のみ提供
    - 1バージョンのサポート期間は8年間
    - 3年間隔でリリース
    - 新しいモデルのリリースはJDK11から
- JDKがOpen, Oracleと別れ、有償、無償であること、リリースモデルがJDK11から変わることを抑えておこう

## JDK10のありがたい話 ローカル変数の型推論　David Buckさん
- [@davidbuckjp](https://twitter.com/DavidBuckJP)さん
- JVMのバグを治す方

### 現在地
- JDK9は2017/09/21にリリース
- The Java Shell
- jdk10 short term release(サポートは今年の9月で終了)、開発用のリリースである。
- jdk11はLong Term Support(LTS)のリリース
- 新しいGCの研究、開発が盛ん
 - ZGC 4TBのヒープを使っても10msの遅延という優れもの
 - Shenandoah Redhadのプロジェクト、コンカレントメモリコンパクション
- プロジェクト Panama...Forgin Function Interface メモリレイアウト
- プロジェクト Valhalla Value Type(値型)、Generic Specialization
- プロジェクト Loom(食器) などがある、調べてみよう

### ローカル変数の型推論

```java 

Arraylist<String> list = new ArrayList<>();
Stream<String> stream = list.stream();

// こうかけるようになる
var list = new new ArrayList<>();
var stream = = list.stream();

```

**型推論は動的型付けになるわけではないことに注意!!!**

#### なぜ今なの?
- javaは書きやすさより読みやすさが重視されていた
- 従来は改行が多い
- varを使うことで短く、読みやすくなる。宣言がなくなるだけ。
- 他の言語も同じ C++...auto, Scala... var/val Go...:=

#### なぜローカル変数だけ？
- Fieldとかメソッドの引数の影響は、複数のファイルをまたがるため。ローカル変数は1ファイルで完結する。型推論のために別ファイルを見たくない。

#### どうやって使う?
- varを使う以外にもいろいろな制約がある
- 制限
    - 初期化は必須
    - 配列のカッコは利用できない
    - 低数の宣言は禁止
    - 配列リテラル
    - null初期化
    - 解決できないpoly表現

- Denotable types()言語で表すことができる。->javaで表せない

```java
var hogehoge = new Object() {
    public void say(){~}
}

hogehoge.say();
```

#### varとは何？
- 予約語? キーワード？
- constとgotoは予約語だがキーワードではない
- キーワード... 言語で何かの意味する表現
- 予約語...使っては行けない
- varはクラス、インターフェースとして利用できない。小文字のvarなんてクラスはないでしょう...という予想
- 変数名やフィールド名としては利用できる

```java
int var = 1; ... ok

class var {

}... ng

var var = var(); コンパイルは通る! 
```

#### どうやってコーディングすべきか？
- OPEN JDK のスタイルガイドをリリースした
- varをどういう場面で使うかを書いている
    1. 書きやすさより読みやすさ、varを使うことで読みやすくなるときにしか使わない
    2. ローカルコードで理解できるとき
    3. IDEなどのツールに依存すべきではない、マウスオーバーで見れば方がわかるから大丈夫! とか言わない
    4. 明示的にタイプを宣言するのはトレードオフ、ラムダ式で匿名インナークラスは使わないという方針になった。けど今回はそういうわけではない。全部のローカル変数をvarで書くのは違う

- どうやって使う?　ガイドライン
    1. 役に立つ情報を表す変数名を使うこと
    2. ローカル変数のスコープは制限しよう
    3. 初期化の分だけから型をわかる場合、varの利用を検討する
    4. 連続の呼び出しを分解するためにvarを利用すること(Streamに多い)
    5. インターフェースプログラミングは気にしなくてもいい(programming to the interface)
    ```java
    var List = new ArrayList<>();
    ```
    6. ダイヤモンド演算子、genericメソッドと一緒に利用する時、気をつけること。
    7. リテラルと一緒に利用するときはきをつける。

### その他
- java10の新しい機能はほかは少ない、short termなので
- Garbage Collector Interface JIT, GC , HosSpotRuntime JITとGCが関与していた。JDKはGCとJITのインターフェースが分けられている
- Parallel Full GC for G1 G1でもfull GCが使えるってこと？
- thread local hondshakes 各スレッドが自分を参照する　1つのスレッドを止めたいときに他のスレッドを止める必要がない。
- jacac -h ...クラスファイル生成と同時にヘッダーファイルも作れる。
- de_DE_EUROの文字コード追加　ドイツ語、ユーロ　
- Heap Allocation on Alternative Memory Device ここのメモリはjavaでみたい!など?
- JIT コンパイラーいについて

## NTT OSSセンタ　久保田　祐史さん きしださん「java 10 で僕達の生活はどう変わるの?」
[久保田祐史](https://twitter.com/sugarlife)
[きしださん](https://twitter.com/kis)

### 12件の新機能
- Docker、あれば便利なAPIが増えた
- デメリット ... アップデートの対応コストが高い
- java 10で動かし見る
- Java 10 でコンパイルする
- jdeps jdeprscanを使ってみる... 内務APIや非推奨APIを使っていないか確認して修正・更新する

### java10の情報収集
- 新機能 JEPを見る [AppCDS @ OpenJDK](https://qiita.com/ykubota/items/664032c14f992e04cde2)
- APIの変更 JSRを見る
- 非互換性 リリースのーとを見る
- JEP310: Application Class Data Sharing　コンテナで大量に動かす、バッチとかに利用される

### Oracle JDK の商用機能
1. AppCDS
2. Resource Management
3. Java Flight Recorder 
4. Java Misson Control

- シングルスレッド実行であった G1 GCのFullGCが並列化...最後の手段なので、これが乱用する状態自体が良くない事態

### 非互換性
- forRemoval=trueは、次バージョン以降に削除される
- 
### Dockerコンテナに関する改善
- コンテナを認識せずホストのCPU数とメモリをもとに設置や動作が行われていた問題を修正 -> Dockerのメモリはこれだけしか割り当ててないのに、JVMはマシンを見ているから割当以上のメモリを使っている! CPUも同じ
- ヒーピに使用するシステムメモリ量を柔軟化 ...表記を%にした。わかりやすい
- ホストからコンテナ上のプロセスにアタッチできるように改善

### API
- Add
 - java.util.Optional.orElseThrow()...置換推奨
 - java.util.{LIST SET MAP} :: copyOf
    - 引数のコレクションが変更可能な場合はコピーして変更不可能なコレクションを返す。変更不可能な場合は、そのままリファレンスをかえすメソッド
- プロセスIDが取得できるようになる

### javadoc
- @Summary　というアノテーションができた。サマリが確実にかける。
- ヘッダとフッダーがしていできる、会社表記、ライセンス表示
- オーバーライドメソッド書式指定(--override-methods)
- policytoolが削除
- javahが削除 java -h
- 
## そのた、感想
- これから覚えなくては、と思ったこと
    - JVM, JITコンパイラー, GC
    - ラムダ式は覚えなくてはと思いました
    - swingとAWT
- 登壇者の方の、聴衆者の皆さんはjavaに精通しているという信頼感がすごい感じ取れました
- JDK10はすぐにリリースできない、JDK11のために準備しておきましょうという感じであることを抑えておく
- JavaJDK10のバグを見つけた話... [きしだのはてな](http://d.hatena.ne.jp/nowokay/20180322)
 - プロダクションはやっぱりLong time Recordを使うべきであること
 - 不具合報告はMLに出してしまえば行けること
 - 敷居が高いとTwitterでつぶやいてみるのもいいかもしれない
- java8 -> 9の乗り換えがとても互換性が厳しい。350pくらいの互換書になったらしい。

- こういうHPがあるよJJUG(ジェイジャグということを初めて知りました)[JJUGのHP](http://www.java-users.jp/ccc2018spring/#/)
- IntelliJ https://qiita.com/syu_chan_1005/items/46f94412f7493d6e60eb
- swingとAWTについてももっと知っておくといいかもしれない。
- [Java 10新機能まとめ](https://qiita.com/nowokay/items/d9bc4b3f715d17c2830d)