Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Javaは今どうなっているの? / how about java now
Search
Naoki Kishida
January 07, 2024
Programming
15
20k
Javaは今どうなっているの? / how about java now
2024年1月7日に行われたFukuoka Engineers Dayでの登壇資料です。
Naoki Kishida
January 07, 2024
Tweet
Share
More Decks by Naoki Kishida
See All by Naoki Kishida
LLMベースAIの基本 / basics of LLM based AI
kishida
12
3.2k
Java 24まとめ / Java 24 summary
kishida
3
640
AI時代のプログラミング教育 / programming education in ai era
kishida
25
26k
Java Webフレームワークの現状 / java web framework at burikaigi
kishida
10
2.5k
AI時代に求められるプログラマの能力 / ability of programmer in AI era
kishida
19
13k
Java 23の概要とJava Web Frameworkの現状 / Java 23 and Java web framework
kishida
2
530
Java Webフレームワークの現状 / java web framework
kishida
10
11k
Is Object Oriented nesessary? COSCUP 2024
kishida
0
200
プログラムに組み込みたい人向けLLMの概要 / LLM for programmers
kishida
3
780
Other Decks in Programming
See All in Programming
PostgreSQLのRow Level SecurityをPHPのORMで扱う Eloquent vs Doctrine #phpcon #track2
77web
2
540
AI駆動のマルチエージェントによる業務フロー自動化の設計と実践
h_okkah
0
170
AIともっと楽するE2Eテスト
myohei
7
2.8k
20250704_教育事業におけるアジャイルなデータ基盤構築
hanon52_
5
840
GitHub Copilot and GitHub Codespaces Hands-on
ymd65536
2
150
MCPを使ってイベントソーシングのAIコーディングを効率化する / Streamlining Event Sourcing AI Coding with MCP
tomohisa
0
110
AI時代の『改訂新版 良いコード/悪いコードで学ぶ設計入門』 / ai-good-code-bad-code
minodriven
20
8.1k
AIエージェントはこう育てる - GitHub Copilot Agentとチームの共進化サイクル
koboriakira
0
600
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
950
코딩 에이전트 체크리스트: Claude Code ver.
nacyot
0
690
Modern Angular with Signals and Signal Store:New Rules for Your Architecture @enterJS Advanced Angular Day 2025
manfredsteyer
PRO
0
230
「テストは愚直&&網羅的に書くほどよい」という誤解 / Test Smarter, Not Harder
munetoshi
0
180
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.5k
Docker and Python
trallard
44
3.5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
We Have a Design System, Now What?
morganepeng
53
7.7k
Adopting Sorbet at Scale
ufuk
77
9.5k
Navigating Team Friction
lara
187
15k
KATA
mclloyd
30
14k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.4k
The Straight Up "How To Draw Better" Workshop
denniskardys
235
140k
Transcript
Javaは今どうなってるの? 2024-01-07 Fukuoka Engineers Day Javaコミュ@福岡 きしだ なおき
2024/01/07 2 自己紹介 • きしだ なおき • LINEヤフー • twitter:
@kis • 「プロになるJava」という Java入門書を書いてます
2024/01/07 3 Javaは今どうなってるの? • より学習しやすく • スレッドモデルの改善 • オブジェクト指向からデータ指向へ
より学習しやすく • Pythonに入門者が奪われてやばい • javac不要で実行できる • パブリックスタティックヴォイドメインからの脱却
javac不要で実行できる • java sample.java で実行可能 • javacを使うときに困ること • javacではファイル名を指定、javaではパッケージ含むクラス名を指定 •
パッケージについて理解が必要 • パッケージ名と同じフォルダにソースがない場合、コンパイルはできるけど実 行はできない • ファイル名とクラス名をあわせる必要がある • 大文字小文字ではまりがち • ちょっと実行したいときにsample.classができるのも邪魔
パブリックスタティックヴォイドメインからの脱却 • パブリックスタティックヴォイドメインの問題 • おまじないがいっぱいある • publicやstaticは相対的なので最初の段階では説明できない • mainから呼び出すメソッドを定義するときには必要になるのでモヤモヤしつ づけることに
• Stringや[]はがんばれば説明できるけど、まだそのときではない • クラスもいらない • 単にコード置き場に なっている public class Sample { public static void main(String[] args) { System.out.println(“Hello world!”); } }
void mainでいける • void main()でいける • void mainを消すためにはmain以外にも影響のある変更が必要 • まだ試用機能
• Java 23くらい?(9月リリース) • System.outもそのうち消せるかも void main() { System.out.println(“Hello world!”); }
スレッドモデルの改善 • グリーンスレッドの復活 • 構造化並列
グリーンスレッドの復活 • Java1.0ではグリーンスレッドだった • 当時は単一CPU、シングルコアしかなかった • GUIのバックグラウンド処理のためが主な目的 • Java1.1でOSスレッドに対応 •
複数CPUが増え始めた。その後マルチコアが当然に • 複数プロセッサで高負荷処理 • Java 21でグリーンスレッドが「仮想スレッド」として導入 • マルチスレッドの目的が通信時に別の処理をしたいだけが多い グリーンスレッド アプリケーションで管理 軽い 複数コアを使えない OSスレッド OSで管理 重い 複数コアを使える
構造化並列 • サブタスクを2つ別スレッドで呼び出すときの問題 • 片方でエラーが出たとき、もう片方がそのまま処理を続けてしまう • 親スレッドが中断したとき、サブタスクだけ生き残ってしまう
オブジェクト指向からデータ指向へ • オブジェクト指向 • オブジェクト指向はモジュール化技術 • モジュール化はすでに行われてる • ブラウザ-サーバー •
マイクロサービス • サーバレス • プログラムをさらにモジュール化する必要がない • データ指向 • データをデータ(not オブジェクト)として扱う • データの性質を型として定義する
データの性質を型として定義する • 抽象データ型 • 代数データ型 • ポリモーフィズムではなく条件分岐
抽象データ型 • 型の定義の指針 • データの操作だけ公開することで変更に強く柔軟な型を定義 • データ特化のカプセル化 • 操作としてデータ操作だけを含む •
レコード型の導入 • 継承は不可 • interfaceの実装は可 record User(long id, String name) {}
代数データ型 • 型の組み合わせの指針 • 代数的に型を扱う • 代数的=足し算と掛け算 • 直積型 •
直和型
直積型 • 値を組み合わせる型 • レコード、クラス、配列 • 値のとりうるパターンがそれぞれの値のとりうるパターンの積 • record A(boolean
a, byte b) {} • 2 x 256で512とおり
直和型 • いずれかの型になる • とりうるパターンは足し算になる • sealedの導入 sealed interface Op
{ record AddOp(int a, int b) implements Op {} record SubOp(int a, int b) implements Op {} }
ポリモーフィズムではなく条件分岐 • switchの改善 • パターンマッチング
ポリモーフィズムではなく条件分岐 • ロジックを正しく書くには、ロジックが一箇所にまとまっている ほうが便利 • ポリモーフィズムではロジックがクラス別に散らばる • そのロジックにかかわるすべての処理の把握が難しい • しらんところで継承されて把握できない処理がまぎれこむこともある
• sealedで対処可能 • 継承に依存したポリモーフィズムでは対応できないことも多い
switchの改善 • breakとか不要に switch(value) { case 1 -> println(“One”); case
2 -> println(“Two”); }
パターンマッチング • 型ごとの処理 • 構造の分解 int calc(Op op) { return
switch(op) { case AddOp(int a, int b) -> a + b; case SubOp(int a, int b) -> a – b; } }
詳しくはJavaコミュ@福岡の勉強会で • Java22が2024/3/19にリリースされるのでその前後でやります • javaq.connpass.com •