Slide 1

Slide 1 text

Javaは今どうなってるの? 2024-01-07 Fukuoka Engineers Day Javaコミュ@福岡 きしだ なおき

Slide 2

Slide 2 text

2024/01/07 2 自己紹介 ● きしだ なおき ● LINEヤフー ● twitter: @kis ● 「プロになるJava」という Java入門書を書いてます

Slide 3

Slide 3 text

2024/01/07 3 Javaは今どうなってるの? ● より学習しやすく ● スレッドモデルの改善 ● オブジェクト指向からデータ指向へ

Slide 4

Slide 4 text

より学習しやすく ● Pythonに入門者が奪われてやばい ● javac不要で実行できる ● パブリックスタティックヴォイドメインからの脱却

Slide 5

Slide 5 text

javac不要で実行できる ● java sample.java で実行可能 ● javacを使うときに困ること ● javacではファイル名を指定、javaではパッケージ含むクラス名を指定 ● パッケージについて理解が必要 ● パッケージ名と同じフォルダにソースがない場合、コンパイルはできるけど実 行はできない ● ファイル名とクラス名をあわせる必要がある ● 大文字小文字ではまりがち ● ちょっと実行したいときにsample.classができるのも邪魔

Slide 6

Slide 6 text

パブリックスタティックヴォイドメインからの脱却 ● パブリックスタティックヴォイドメインの問題 ● おまじないがいっぱいある ● publicやstaticは相対的なので最初の段階では説明できない ● mainから呼び出すメソッドを定義するときには必要になるのでモヤモヤしつ づけることに ● Stringや[]はがんばれば説明できるけど、まだそのときではない ● クラスもいらない ● 単にコード置き場に なっている public class Sample { public static void main(String[] args) { System.out.println(“Hello world!”); } }

Slide 7

Slide 7 text

void mainでいける ● void main()でいける ● void mainを消すためにはmain以外にも影響のある変更が必要 ● まだ試用機能 ● Java 23くらい?(9月リリース) ● System.outもそのうち消せるかも void main() { System.out.println(“Hello world!”); }

Slide 8

Slide 8 text

スレッドモデルの改善 ● グリーンスレッドの復活 ● 構造化並列

Slide 9

Slide 9 text

グリーンスレッドの復活 ● Java1.0ではグリーンスレッドだった ● 当時は単一CPU、シングルコアしかなかった ● GUIのバックグラウンド処理のためが主な目的 ● Java1.1でOSスレッドに対応 ● 複数CPUが増え始めた。その後マルチコアが当然に ● 複数プロセッサで高負荷処理 ● Java 21でグリーンスレッドが「仮想スレッド」として導入 ● マルチスレッドの目的が通信時に別の処理をしたいだけが多い グリーンスレッド アプリケーションで管理 軽い 複数コアを使えない OSスレッド OSで管理 重い 複数コアを使える

Slide 10

Slide 10 text

構造化並列 ● サブタスクを2つ別スレッドで呼び出すときの問題 ● 片方でエラーが出たとき、もう片方がそのまま処理を続けてしまう ● 親スレッドが中断したとき、サブタスクだけ生き残ってしまう

Slide 11

Slide 11 text

オブジェクト指向からデータ指向へ ● オブジェクト指向 ● オブジェクト指向はモジュール化技術 ● モジュール化はすでに行われてる ● ブラウザ-サーバー ● マイクロサービス ● サーバレス ● プログラムをさらにモジュール化する必要がない ● データ指向 ● データをデータ(not オブジェクト)として扱う ● データの性質を型として定義する

Slide 12

Slide 12 text

データの性質を型として定義する ● 抽象データ型 ● 代数データ型 ● ポリモーフィズムではなく条件分岐

Slide 13

Slide 13 text

抽象データ型 ● 型の定義の指針 ● データの操作だけ公開することで変更に強く柔軟な型を定義 ● データ特化のカプセル化 ● 操作としてデータ操作だけを含む ● レコード型の導入 ● 継承は不可 ● interfaceの実装は可 record User(long id, String name) {}

Slide 14

Slide 14 text

代数データ型 ● 型の組み合わせの指針 ● 代数的に型を扱う ● 代数的=足し算と掛け算 ● 直積型 ● 直和型

Slide 15

Slide 15 text

直積型 ● 値を組み合わせる型 ● レコード、クラス、配列 ● 値のとりうるパターンがそれぞれの値のとりうるパターンの積 ● record A(boolean a, byte b) {} ● 2 x 256で512とおり

Slide 16

Slide 16 text

直和型 ● いずれかの型になる ● とりうるパターンは足し算になる ● sealedの導入 sealed interface Op { record AddOp(int a, int b) implements Op {} record SubOp(int a, int b) implements Op {} }

Slide 17

Slide 17 text

ポリモーフィズムではなく条件分岐 ● switchの改善 ● パターンマッチング

Slide 18

Slide 18 text

ポリモーフィズムではなく条件分岐 ● ロジックを正しく書くには、ロジックが一箇所にまとまっている ほうが便利 ● ポリモーフィズムではロジックがクラス別に散らばる ● そのロジックにかかわるすべての処理の把握が難しい ● しらんところで継承されて把握できない処理がまぎれこむこともある ● sealedで対処可能 ● 継承に依存したポリモーフィズムでは対応できないことも多い

Slide 19

Slide 19 text

switchの改善 ● breakとか不要に switch(value) { case 1 -> println(“One”); case 2 -> println(“Two”); }

Slide 20

Slide 20 text

パターンマッチング ● 型ごとの処理 ● 構造の分解 int calc(Op op) { return switch(op) { case AddOp(int a, int b) -> a + b; case SubOp(int a, int b) -> a – b; } }

Slide 21

Slide 21 text

詳しくはJavaコミュ@福岡の勉強会で ● Java22が2024/3/19にリリースされるのでその前後でやります ● javaq.connpass.com ●