読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

盛り返すJava #渋谷JVM

勉強会 Java

d.hatena.ne.jp

Spring Framework + JSF + JPA

collection.line.me

それなりにハマる。

まだJavaで消耗してるの?

  • Java嫌いな俺かっこいい
  • Javaを批判するとプログラミングに造詣が深い気がする
  • Javaの文法を批判すると言語に造詣が深い気がする
  • 実際Javaが嫌い

そういう風潮あったよ

なんでJavaがいけてないのか

誰も教えてくれないJavaの世界

  • クライアント→Web業務→ネットサービス…
  • 黎明期(-2000)→黄金期(-2005)→停滞期(-2010)→再生期(-2015)

  • 適切に機能が更新されていないから

  • 適切に予算が投入されていない
  • 適切にマネジメントされていない

オラクル

  • おかねもち
  • 淡々とマネジメント
  • OracleにとってJavaはわりとどうでもよく、Javaが消滅してもそんなにダメージがなかったりするし、逆にJavaでうまくやっても株価が上がるわけでもない。故に淡々とやるべきことをやっているイメージだし、逆に派手な機能も入っていない。

JLUG CCC

  • 参加者が伸びている(2013春で280人だったのが2015春で666人)

TIOBE一位返り咲き

www.tiobe.com

ラムダ!

  • 実装すべきメソッドがひとつのインターフェース
  • Runnable run()
  • ActionListener actionPerformed(ActoinEvent)

Javaラムダ式メモ(Hishidama's Java8 Lambda Expression Memo)

匿名クラスのシンタックスシュガー?

シンタックスシュガーではない。

  • thisの扱いが違う
  • ラムダの外側のオブジェクトを示す
  • 匿名クラスの場合は匿名クラス自身を示す

  • ラムダをコンパイルしても余分なクラスはできていない。

  • バイトコードを読んで見ると、InvokeDynamicが最初に使われている。
  • で、クラスができていない。

なぜ匿名クラスじゃないのか

  • 匿名クラスだとクラスができまくる
  • しかもあまり使われないクラスが生成される
  • 起動時にクラスロードに時間がかかる可能性がある
  • いちいちコンストラクタを呼び出してオブジェクト生成する(いちいちnewするからリソースが無駄になってしまう)

Java SE 7 で導入されたInvokeDynamic

  • もともとは動的型言語のため(実行時にもJavaVMが使えるように Cと変わらない速さで動く)
  • 実行時にメソッドの型を決めつつJava VMの最適化もかけやすくなる
  • invokedynamic命令

  • ラムダオブジェクトの生成

  • 関数型インタフェースを実装したクラスのインスタンスを生成するメソッドが返される
  • VMが変わるとより最適化されたインスタンスが生成された可能性

くわしくはこちらから。

www.slideshare.net

Javaの欠点

  • 基本型の参照型の非互換性
  • ラムダが入っていても記述がダサい

基本型の参照型の非互換性

  • StringとIntStream
  • OptionalとOptionalInt(命名規則がよくわからない)
  • 用意された関数型インタフェース

関数型インタフェースについてはこちらを参照。 d.hatena.ne.jp

  • 記述がダサい(Optionalとか長い) シンタックスシュガーを導入してしまうにはOptionalというオブジェクトを毎回使うのは実行時コストが高い
  • 小さいノードで動かすプログラムが増えていくなかでOptional使うのは面倒だし、オブジェクトを使わないと実行出来ないのも面倒(BigDecimalとか)

Project Valhalla

OpenJDK: Valhalla

d.hatena.ne.jp

  • Specialization ArrayList
  • Genericsの型指定に基本型を指定可能とする

d.hatena.ne.jp

  • ジェネリクス
  • any T
  • 配列の生成が出来る
  • nullと比較できない
  • Objectとの変換ができない
  • synchronizedできない
  • キャストの制約

anyTの問題点

  • nullどうしよう
  • オーバーロード
  • void remove(T)
  • void remove(int)

Specializedされたクラスをいつつくるか

  • コンパイル時にはつくらない
  • ClassDynamicを導入したらどうか
  • 動的なクラスリンク
  • InvokeDynamicのクラス版

Value Type

valhallaで追加された機能。

value class Point {
  int x;
  int y;
}
  • 参照ではない
  • メモリに直接配置される
  • 効率がいい
  • 現在のクラスと互換性が保てればOptionalシンタックスシュガーの導入も可能。

case classは22個までしかメソッドは用意できない

value typeはJava10(3年後)に入る予定。。

ほかの言語は?

  • Scala
  • Don Giovanni(ググラビリティ低すぎだろ)

まとめ

  • そろそろJava見なおしてもいいと思う

Project Valhallaについて

d.hatena.ne.jp