Java Update
高橋 徹(Java読書会BOF)
発表者(高橋 徹)について
コミュニティ活動
ブログ等
• ブログ http://d.hatena.ne.jp/torutk/ 他
• Twitter @boochnich
毎月1回開催中
現時点で
209回開催(30冊)
LLoT Language Update - Java2016-08-27 2
本日お話すること
Javaってどんな言語?
Javaが生まれてこの方
さいきんの変化
スクリプト言語と仲良く
LLoT Language Update - Java2016-08-27 3
Javaってどんな言語?
「Java言語仕様 第3版」第1章冒頭
(ピアソン・エデュケーション 刊、 村上雅章 訳)より
プログラミング言語Java™は、
並列処理の可能な
クラスに基づく
汎用目的のオブジェクト指向言語である。
LLoT Language Update - Java2016-08-27 4
Javaってどんな言語?
2016-08-27 LLoT Language Update - Java 5
CPU(Intel、SPARC、ARM等)
OS(各種UNIX、Windows等)
Java仮想マシン
Java標準ライブラリ
Javaプログラム Javaソースコード
コンパイル
Javaの構造
2016-08-27 LLoT Language Update - Java 6
Oracle JDK 8対応CPU・OS
Javaってどんな言語?
Javaってどんな言語?
2016-08-27 LLoT Language Update - Java 7
Java標準ライブラリ
Javaが生まれてこの方
1.0 1.1 1.2 1.3 1.4 5 6 7 8 9
2016-08-27 LLoT Language Update - Java 8
1995 1996 1998 2000 2002 2004 2006 2011 2014 2017(予)
1.1
インナークラス
1.4
assert
5
ジェネリクス
オートボクシング
列挙型
拡張for文
可変長引数
アノテーション
static import
7
try-with-resource
例外マルチキャッチ
数値リテラル表記
switch文にString
言語仕様
8
ラムダ式
interfaceに実装可
Javaが生まれてこの方
1.0 1.1 1.2 1.3 1.4 5 6 7 8 9
2016-08-27 LLoT Language Update - Java 9
1995 1996 1998 2000 2002 2004 2006 2011 2014 2017(予)
1.1
インナークラス
1.4
assert
5
ジェネリクス
オートボクシング
列挙型
拡張for文
可変長引数
アノテーション
static import
7
try-with-resource
例外マルチキャッチ
数値リテラル表記
switch文にString
言語仕様
8
ラムダ式
interfaceに実装可
10年に1回、大きな改訂
Javaが生まれてこの方
1.0 1.1 1.2 1.3 1.4 5 6 7 8 9
2016-08-27 LLoT Language Update - Java 10
1995 1996 1998 2000 2002 2004 2006 2011 2014 2017(予)
1.1
国際化
リフレクション
JDBC
1.2
Swing/Java2D
CORBA
1.3
JNDI
Sound
Timer
1.4
正規表現
ロギング
XML
SSL/TSL
Preference
イメージI/O
NIO
標準ライブラリ
7
NIO.2
8
Stream
日時
JavaFX
5
並行処理
JMX
Javaが生まれてこの方
2016-08-27 LLoT Language Update - Java 11
標準ライブラリの成長
0
50
100
150
200
250
0
500
1000
1500
2000
2500
3000
3500
4000
4500
1.0.2 1.1 1.2 1.3 1.4 5 6 7 8
パッケージ数
クラス数
Javaバージョン
クラス数
パッケージ数
Javaが生まれてこの方
• 互換性のポリシー
2016-08-27 LLoT Language Update - Java 12
Java バージョンNで提供するAPIを使う
プログラムは、再コンパイルせずに
JavaバージョンN+1で動作すべきである。
提供するAPIは前もって予告(deprecate)
したうえで削除することが可能。
→ deprecateはあるが削除されたAPIはない
Javaが生まれてこの方
• 互換性のポリシー
2016-08-27 LLoT Language Update - Java 13
Java バージョンNで提供するAPIを使う
プログラムは、再コンパイルせずに
JavaバージョンN+1で動作すべきである。
提供するAPIは前もって予告(deprecate)
したうえで削除することが可能。
→ deprecateはあるが削除されたAPIはない
コンパイルしたクラスファイルは
新しいJavaバージョンでも動くよ。
標準APIは消さないから20年前の
コードも動くよ
Javaが生まれてこの方
1.0 1.1 1.2 1.3 1.4 5 6 7 8 9
2016-08-27 LLoT Language Update - Java 14
1995 1996 1998 2000 2002 2004 2006 2011 2014 2017(予)
Java仮想マシン
Classic VM
HotSpot VM
JIT コンパイラ
Adaptiveコンパイラ、世代別GC
CMS GC
G1GC
Java Update – Java SE 8
• ラムダ式
• interfaceへstatic/defaultメソッド(実装記述)
• タイプアノテーション
2016-08-27 LLoT Language Update - Java 15
• Intel CPUのAES-NI対応
• Streams API
• Date and Time API
• JavaFX
言語仕様
標準ライブラリ
仮想マシン
Java Update – Java SE 8
• ラムダ式
インタフェースのインスタンスを生成(従来)
2016-08-27 LLoT Language Update - Java 16
class クラス名 implements インタフェース名 {
戻り値型 メソッド名(引数リスト) {
処理
}
}
インタフェース名 変数名 = new クラス名();
Java Update – Java SE 8
• ラムダ式
インタフェースのインスタンスを生成
2016-08-27 LLoT Language Update - Java 17
インタフェース名 変数名 = (引数リスト) -> {処理};
Java Update – Java SE 8
• ラムダ式
コールバック処理(オブザーバーパターン)を
匿名クラスで実装
2016-08-27 LLoT Language Update - Java 18
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
model.execute();
}
});
Java Update – Java SE 8
• ラムダ式
コールバック処理(オブザーバーパターン)を
ラムダ式で実装
2016-08-27 LLoT Language Update - Java 19
button.setOnAction( event -> model.execute() );
• コマンドパターン
• ストラテジーパターン
• テンプレートメソッドパターン
などにも適用可
Java Update – Java SE 8
• インタフェースへの実装
従来、メソッドはシグニチャ定義のみ
実装を持つ次の2種類のメソッドを定義できる
1)staticメソッド
2)defaultメソッド
2016-08-27 LLoT Language Update - Java 20
Java Update – Java SE 8
• インタフェースへの実装
1)static メソッドの実装
2)defaultメソッドの実装
2016-08-27 LLoT Language Update - Java 21
interface HelloEntry {
static void main(String... args) {
System.out.prinln(“I’m an interface.”);
}
}
interface Greet {
default void greet() {
System.out.prinln(“Hello an interface.”);
}
}
Java Update – Java SE 8
• インタフェースへの実装
メリット)既存のインタフェースにメソッドを追加
しても壊れない
2016-08-27 LLoT Language Update - Java 22
interface Alfa
void m1();
class Bravo
void m1() {
処理;
}
void m2(); を追加すると
Bravoがコンパイルエラー
default void m2() {
処理;
}
の追加ならBravoは壊れない
JavaFX 8
NASA Tracking and Orbit Determination Quality Viewer
2016-08-27 LLoT Language Update - Java 23
https://dzone.com/articles/nasa-conjunction-assessment
Java Update – Java SE 8
Java Update – Java SE 9
大きな変更
• 新たなモジュール機能を搭載
標準ライブラリをモノリシックからモジュール化
• REPL環境
2016-08-27 LLoT Language Update - Java 24
Java Update – Java SE 9
モジュール化(Jigsaw)
• 依存関係、バージョン番号を付与した新たな構造
• Java標準ライブラリをモジュール化
• アプリケーションもモジュールとして作成可
• アプリケーションの実行に必要な
モジュールだけを抽出して配布
2016-08-27 LLoT Language Update - Java 25
Java Update – Java SE 9
REPL環境
2016-08-27 LLoT Language Update - Java 26
Script言語とおともだちに
• JavaScript
Java SE標準搭載
jjsコマンドでJavaScript実行
JavaScriptテキストを実行するAPI
• JRuby
http://jruby.org/
Ruby 2.3対応
• Jython
http://www.jython.org/
Python 2.7対応
2016-08-27 LLoT Language Update - Java 27
ご清聴ありがとうございました
2016-08-27 LLoT Language Update - Java 28
Java Update – Java SE 8
• メソッド参照
インタフェースのインスタンスを生成する別な方法
2016-08-27 LLoT Language Update - Java 29
インタフェース名 変数名 = 変数名::メソッド名;
インタフェース名 変数名 = クラス名::メソッド名;

LLoT2016 Java Update

  • 1.
  • 2.
    発表者(高橋 徹)について コミュニティ活動 ブログ等 • ブログhttp://d.hatena.ne.jp/torutk/ 他 • Twitter @boochnich 毎月1回開催中 現時点で 209回開催(30冊) LLoT Language Update - Java2016-08-27 2
  • 3.
  • 4.
    Javaってどんな言語? 「Java言語仕様 第3版」第1章冒頭 (ピアソン・エデュケーション 刊、村上雅章 訳)より プログラミング言語Java™は、 並列処理の可能な クラスに基づく 汎用目的のオブジェクト指向言語である。 LLoT Language Update - Java2016-08-27 4
  • 5.
    Javaってどんな言語? 2016-08-27 LLoT LanguageUpdate - Java 5 CPU(Intel、SPARC、ARM等) OS(各種UNIX、Windows等) Java仮想マシン Java標準ライブラリ Javaプログラム Javaソースコード コンパイル Javaの構造
  • 6.
    2016-08-27 LLoT LanguageUpdate - Java 6 Oracle JDK 8対応CPU・OS Javaってどんな言語?
  • 7.
    Javaってどんな言語? 2016-08-27 LLoT LanguageUpdate - Java 7 Java標準ライブラリ
  • 8.
    Javaが生まれてこの方 1.0 1.1 1.21.3 1.4 5 6 7 8 9 2016-08-27 LLoT Language Update - Java 8 1995 1996 1998 2000 2002 2004 2006 2011 2014 2017(予) 1.1 インナークラス 1.4 assert 5 ジェネリクス オートボクシング 列挙型 拡張for文 可変長引数 アノテーション static import 7 try-with-resource 例外マルチキャッチ 数値リテラル表記 switch文にString 言語仕様 8 ラムダ式 interfaceに実装可
  • 9.
    Javaが生まれてこの方 1.0 1.1 1.21.3 1.4 5 6 7 8 9 2016-08-27 LLoT Language Update - Java 9 1995 1996 1998 2000 2002 2004 2006 2011 2014 2017(予) 1.1 インナークラス 1.4 assert 5 ジェネリクス オートボクシング 列挙型 拡張for文 可変長引数 アノテーション static import 7 try-with-resource 例外マルチキャッチ 数値リテラル表記 switch文にString 言語仕様 8 ラムダ式 interfaceに実装可 10年に1回、大きな改訂
  • 10.
    Javaが生まれてこの方 1.0 1.1 1.21.3 1.4 5 6 7 8 9 2016-08-27 LLoT Language Update - Java 10 1995 1996 1998 2000 2002 2004 2006 2011 2014 2017(予) 1.1 国際化 リフレクション JDBC 1.2 Swing/Java2D CORBA 1.3 JNDI Sound Timer 1.4 正規表現 ロギング XML SSL/TSL Preference イメージI/O NIO 標準ライブラリ 7 NIO.2 8 Stream 日時 JavaFX 5 並行処理 JMX
  • 11.
    Javaが生まれてこの方 2016-08-27 LLoT LanguageUpdate - Java 11 標準ライブラリの成長 0 50 100 150 200 250 0 500 1000 1500 2000 2500 3000 3500 4000 4500 1.0.2 1.1 1.2 1.3 1.4 5 6 7 8 パッケージ数 クラス数 Javaバージョン クラス数 パッケージ数
  • 12.
    Javaが生まれてこの方 • 互換性のポリシー 2016-08-27 LLoTLanguage Update - Java 12 Java バージョンNで提供するAPIを使う プログラムは、再コンパイルせずに JavaバージョンN+1で動作すべきである。 提供するAPIは前もって予告(deprecate) したうえで削除することが可能。 → deprecateはあるが削除されたAPIはない
  • 13.
    Javaが生まれてこの方 • 互換性のポリシー 2016-08-27 LLoTLanguage Update - Java 13 Java バージョンNで提供するAPIを使う プログラムは、再コンパイルせずに JavaバージョンN+1で動作すべきである。 提供するAPIは前もって予告(deprecate) したうえで削除することが可能。 → deprecateはあるが削除されたAPIはない コンパイルしたクラスファイルは 新しいJavaバージョンでも動くよ。 標準APIは消さないから20年前の コードも動くよ
  • 14.
    Javaが生まれてこの方 1.0 1.1 1.21.3 1.4 5 6 7 8 9 2016-08-27 LLoT Language Update - Java 14 1995 1996 1998 2000 2002 2004 2006 2011 2014 2017(予) Java仮想マシン Classic VM HotSpot VM JIT コンパイラ Adaptiveコンパイラ、世代別GC CMS GC G1GC
  • 15.
    Java Update –Java SE 8 • ラムダ式 • interfaceへstatic/defaultメソッド(実装記述) • タイプアノテーション 2016-08-27 LLoT Language Update - Java 15 • Intel CPUのAES-NI対応 • Streams API • Date and Time API • JavaFX 言語仕様 標準ライブラリ 仮想マシン
  • 16.
    Java Update –Java SE 8 • ラムダ式 インタフェースのインスタンスを生成(従来) 2016-08-27 LLoT Language Update - Java 16 class クラス名 implements インタフェース名 { 戻り値型 メソッド名(引数リスト) { 処理 } } インタフェース名 変数名 = new クラス名();
  • 17.
    Java Update –Java SE 8 • ラムダ式 インタフェースのインスタンスを生成 2016-08-27 LLoT Language Update - Java 17 インタフェース名 変数名 = (引数リスト) -> {処理};
  • 18.
    Java Update –Java SE 8 • ラムダ式 コールバック処理(オブザーバーパターン)を 匿名クラスで実装 2016-08-27 LLoT Language Update - Java 18 button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { model.execute(); } });
  • 19.
    Java Update –Java SE 8 • ラムダ式 コールバック処理(オブザーバーパターン)を ラムダ式で実装 2016-08-27 LLoT Language Update - Java 19 button.setOnAction( event -> model.execute() ); • コマンドパターン • ストラテジーパターン • テンプレートメソッドパターン などにも適用可
  • 20.
    Java Update –Java SE 8 • インタフェースへの実装 従来、メソッドはシグニチャ定義のみ 実装を持つ次の2種類のメソッドを定義できる 1)staticメソッド 2)defaultメソッド 2016-08-27 LLoT Language Update - Java 20
  • 21.
    Java Update –Java SE 8 • インタフェースへの実装 1)static メソッドの実装 2)defaultメソッドの実装 2016-08-27 LLoT Language Update - Java 21 interface HelloEntry { static void main(String... args) { System.out.prinln(“I’m an interface.”); } } interface Greet { default void greet() { System.out.prinln(“Hello an interface.”); } }
  • 22.
    Java Update –Java SE 8 • インタフェースへの実装 メリット)既存のインタフェースにメソッドを追加 しても壊れない 2016-08-27 LLoT Language Update - Java 22 interface Alfa void m1(); class Bravo void m1() { 処理; } void m2(); を追加すると Bravoがコンパイルエラー default void m2() { 処理; } の追加ならBravoは壊れない
  • 23.
    JavaFX 8 NASA Trackingand Orbit Determination Quality Viewer 2016-08-27 LLoT Language Update - Java 23 https://dzone.com/articles/nasa-conjunction-assessment Java Update – Java SE 8
  • 24.
    Java Update –Java SE 9 大きな変更 • 新たなモジュール機能を搭載 標準ライブラリをモノリシックからモジュール化 • REPL環境 2016-08-27 LLoT Language Update - Java 24
  • 25.
    Java Update –Java SE 9 モジュール化(Jigsaw) • 依存関係、バージョン番号を付与した新たな構造 • Java標準ライブラリをモジュール化 • アプリケーションもモジュールとして作成可 • アプリケーションの実行に必要な モジュールだけを抽出して配布 2016-08-27 LLoT Language Update - Java 25
  • 26.
    Java Update –Java SE 9 REPL環境 2016-08-27 LLoT Language Update - Java 26
  • 27.
    Script言語とおともだちに • JavaScript Java SE標準搭載 jjsコマンドでJavaScript実行 JavaScriptテキストを実行するAPI •JRuby http://jruby.org/ Ruby 2.3対応 • Jython http://www.jython.org/ Python 2.7対応 2016-08-27 LLoT Language Update - Java 27
  • 28.
  • 29.
    Java Update –Java SE 8 • メソッド参照 インタフェースのインスタンスを生成する別な方法 2016-08-27 LLoT Language Update - Java 29 インタフェース名 変数名 = 変数名::メソッド名; インタフェース名 変数名 = クラス名::メソッド名;