Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Javaが最強JVM言語に なる日はくるのか LINE Fukuoka きしだ なおき 2020/10/4 J Lang Fest Kansai Online #1 Microsoft Flight Simulator 2020
Slide 2
Slide 2 text
自己紹介 • きしだ なおき(@kis) • LINE Fukuoka • MSフライトシミュレータで墜落がうまくなった • オンライン登壇での待機中にキッチンを片付け たくなる
Slide 3
Slide 3 text
この発表で「Java」はJava言語を示します
Slide 4
Slide 4 text
Javaはいまでも 最強JVM言語です 終 制作・著作 ⓀⒾⓈ Microsoft Flight Simulator 2020
Slide 5
Slide 5 text
Java Bean 関数型 セミコロン省略 equals Stream public static void main ラッパークラス 非同期処理 null メソッド定義 パターンマッチング
Slide 6
Slide 6 text
Java Bean • コンストラクタ • setter / getter • toString / equals / hashCode • IDEでの自動生成やlombokでの暗黙の生成ができるとはいえ 面倒
Slide 7
Slide 7 text
Java Beanへの対応 • Records(JEP 384, preview) • イミュータブルなデータ運搬型を定義できる
Slide 8
Slide 8 text
Recordsの欠点 • ミュータブルにはできない • setter / getterは定義されない • 属性と同じ名前のメソッドが定義される • 既存のフレームワークがそのまま使えない
Slide 9
Slide 9 text
パターンマッチ • パターンマッチかっこいい
Slide 10
Slide 10 text
パターンマッチへの対応 • instanceofで型パターンマッチに対応(JEP 375, preview 2) • switch式(JEP 361, standard) • switchでのパターンマッチ(JEP Draft) • Recordの分解(未JEP) • 仕様決め難しそう
Slide 11
Slide 11 text
null • nullは悪 • Optionalめんどい
Slide 12
Slide 12 text
nullへの対応 • Optionalのパターンマッチへの対応(構想あり) • unapply相当の仕組みで対応する • 時間がかかりそう
Slide 13
Slide 13 text
文字列定義 • 複数行の文字列を定義したい • 変数を埋め込みたい
Slide 14
Slide 14 text
文字列定義への対応 • Text Blocks(JEP 378, standard) • ダブルクオート3つで複数行文字列の定義 • 変数補完(インターポレーション)はない • formattedというメソッドが導入されたので代替 • "message is %s".formatted("hello")
Slide 15
Slide 15 text
非同期処理 • 通信中に別の処理をしたい • Kotlinにはコルーチンがある • Rxは人類には早すぎた
Slide 16
Slide 16 text
非同期処理への対応 • Project Loom • 仮想スレッドのJVMへの導入 • OS管理ではなくJVMで管理するスレッド(グリーンスレッド) • OSリソースを食わないので軽量 • バイトコードレベルで対処を行う • 言語仕様への変更不要 • synchronizedまわりに変更あるかも? • 他の言語にも恩恵あり • 着実に開発進んでる模様
Slide 17
Slide 17 text
ラッパークラス • intやbooleanなど基本型に対応するラッパークラスが必要 • 変換自体は自動で行われるので意識することは少なくなった • Genericsで基本型が使えない • IntStreamやOptinalInt、IntFuncitonなど基本型用のクラスや インタフェースが必要
Slide 18
Slide 18 text
ラッパークラスへの対応 • Project Valhallaで進行中 • Listが書ける • バイトコードを拡張 • 新しいバイトコード命令の追加 • つまり大工事
Slide 19
Slide 19 text
Project Valhallaの問題点 • あまり順調ではなさそう・・・ • 基本型の値に対してメソッドを呼び出すことはできなそう • 123.times(System.out::println)のような書き方はできない
Slide 20
Slide 20 text
メソッド定義の簡素化 • 式を返すだけなのにいろいろ書かないといけない • String myMessage(String m) { return "message is %s".formatter(m); }
Slide 21
Slide 21 text
メソッド定義の簡素化への対応 • Concise Method Bodies(JEP draft) • String myMessage(String m) = "message is %s".formatted(m); • 処理が単一の式であればreturnが不要になる
Slide 22
Slide 22 text
ローカル関数 • メソッドの中でメソッドを定義したい • ラムダを使うのは美しくない • 匿名クラスを使うのはハッキー • var m = new Object() { double area(double r) { return r * r * PI; } }; println(m.area(5));
Slide 23
Slide 23 text
ローカル関数への対応 • Gitにそれっぽいブランチがある
Slide 24
Slide 24 text
関数の後置(中置) • 関数をうしろに書きたい • Kotlinのletとか • String.formatに対するformattedのようなものを普通に 使いたい
Slide 25
Slide 25 text
関数の後置への対応 • String.transform • 他のクラスにも拡張するかも?
Slide 26
Slide 26 text
拡張メソッド • Stringとか拡張したい
Slide 27
Slide 27 text
拡張メソッドへの対応 • 計画の気配なし • 理論的には可能
Slide 28
Slide 28 text
メインメソッド • public static void mainってややこしい • クラスが必要になるのもわかりにくい • 使い捨て処理を書くのが面倒 • 初心者の入門を阻害
Slide 29
Slide 29 text
メインメソッドへの対応 • 計画の気配なし • 理論的には可能 • javacなしでjavaコマンドだけでの実行は可能 • Launch Single-File Source-Code Programs(JEP 330)
Slide 30
Slide 30 text
equals • 同値性の検証にメソッド呼び出しが必要 • 間違いがち • めんどう
Slide 31
Slide 31 text
equalsへの対応 • 予定なし • 互換性考えると無理
Slide 32
Slide 32 text
Stream • stream()ってつけるの面倒 • Listを出力したいときのcollect(Collectors.toList())が面倒 • 直接toListってやりたい • toArrayはある
Slide 33
Slide 33 text
Streamへの対応 • StreamをCollectionフレームワークに依存させたくないという Brian Goetzの強い意志があるので無理
Slide 34
Slide 34 text
関数型 • ラムダ式によってリテラルとしては記述できるようになった • 型としてはインタフェースを使う必要がある • 必要な型に対応するインタフェースを覚えるのは大変 • Function / Supplier / Comsumer • IntFunction / ByFunction・・・ • 例外に対応しようとすると別に定義が必要 • 仕様がややこしい
Slide 35
Slide 35 text
関数型への対応 • 無理そう
Slide 36
Slide 36 text
セミコロン省略 • 流行りはセミコロンの省略 • Javaでセミコロンを書かずに処理を書くのは変態
Slide 37
Slide 37 text
セミコロン省略への対応 • 過去のコードがコンパイルできるよう仕様変更するのは無理 • セミコロンと和解せよ
Slide 38
Slide 38 text
その他 • ifは式にならないの? • 条件演算子を使おう • 戻り値の型推論は? • 構文上、結局varって書くことになるのであまり意味がなさそう
Slide 39
Slide 39 text
ここまでのまとめ 機能 状況 Java Bean Recordで対応 フレームワークの対応が必要 パターンマッチ 実装中 deconstructionは時間かかりそう null Optionalへのパターンマッチ まだ時間がかかる 文字列定義 Text Blocks 変数補完は入らなそう 非同期処理 Project Loom ラッパークラス Project Valhalla 先は長そう メソッド定義の簡素化 JEP draft ローカルメソッド Gitにブランチあり 関数の後置 String.translate 拡張メソッド 理論的には可能 計画なし メインメソッド 理論的には可能 計画なし equals 無理 Stream 無理 関数型 無理 セミコロン省略 無理
Slide 40
Slide 40 text
JavaがJVM最強言語に なることはありません 終 制作・著作 ⓀⒾⓈ Microsoft Flight Simulator 2020
Slide 41
Slide 41 text
まとめ • Javaの改善は続いている • 既存構文との整合性を考えると最強になりえない • Javaで言語機能が対応するとJVMに最適化機構が入る • 他の言語でも性能が改善する
Slide 42
Slide 42 text
JVMが最強実行環境で あればそれでいいのだ 終 制作・著作 ⓀⒾⓈ Microsoft Flight Simulator 2020