3月20日にリリース予定のJDK10では12のJEPが提案され、実装/実現される見通しです。今回注目の新機能はJEP286: Local-Variable Type Inference- ローカル変数の型省略(var記法)です。このセッションではこのJEPの解説を中心に、その他主なJEPの紹介を行います。
5. JDK 9(2017年9月21日)
• Short Term Release (サポートは今月で終了)
• JEP 193: Variable Handles
• JEP 222: jshell: The Java Shell (Read-Eval-Print Loop)
• JEP 237: Linux/AArch64 Port
• JEP 254: Compact Strings
• JEP 282: jlink: The Java Linker
• JEP 295: Ahead-of-Time Compilation
7. JDK 11(2018年9月)
• Long Term Support (LTS) のリリース
• 309: Dynamic Class-File Constants
• 318: Epsilon: An Arbitrarily Low-Overhead Garbage Collector
• 320: Remove the Java EE and CORBA Modules
• 323: Local-Variable Syntax for Lambda Parameters
9. プロジェクト Panama
• Foreign Function Interface
• メモリレイアウト(struct など)
By US DOT - https://www.transportation.gov/fastlane/expanded-canal-means-an-expanded-economy, Public Domain, https://commons.wikimedia.org/w/index.php?curid=54989250
10. プロジェクト Valhalla
• Value Types (値型)
• Generic Specialization (ジェネリックの特殊化)
By Emil Doepler - Doepler, Emil. ca. 1905. Walhall, die Götterwelt der Germanen. Martin Oldenbourg, Berlin. Photographed by Haukurth (talk · contribs) and cropped by Bloodofox (talk · contribs)., Public Domain
14. JEP 286 と言えば
By Konstantin Lanzet (with permission) - CPU collection Konstantin Lanzet, received per EMailCamera: Canon EOS 400D, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=4213086
30. 制限
• 初期化は必須
var x;
• 配列のカッコは利用できない
var x[] = new int[42];
• 複数の宣言は禁止
var x = 1, y = 2;
• 配列のリテラルは禁止
var x = { 8, 6, 7, 5, 3,
0, 9 };
• 初期化の表現は変数を参照す
ることは禁止
var x = (x = 7);
• Nullの初期化は禁止
var x = null;
• 解決できない poly 表現
var x = f = (x, y) ->
x+y;
31. 制限
• 初期化は必須
var x;
• 配列のカッコは利用できない
var x[] = new int[42];
• 複数の宣言は禁止
var x = 1, y = 2;
• 配列のリテラルは禁止
var x = { 8, 6, 7, 5, 3,
0, 9 };
• 初期化の表現は変数を参照す
ることは禁止
var x = (x = 7);
• Nullの初期化は禁止
var x = null;
• 解決できない poly 表現
var x = f = (x, y) ->
x+y;
32. Denotable types
var hogehoge = new Object() {
public void sayHi() {
System.out.println(“Hello JJUG!”);
}
};
hogehoge.sayHi();
Class<?> c = hogehoge.getClass();
System.out.println(c.getName()); // Test$1
34. Java の予約語
abstract continue for new switch
assert default goto package synchronized
boolean do if private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
35. Java の予約語
abstract continue for new switch
assert default goto package synchronized
boolean do if private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
62. 連続の呼び出しを分解するために var を
利用すること
var freqMap = strings.stream()
.collect(groupingBy(s -> s,
counting()));
var maxEntryOpt = freqMap.entrySet()
.stream()
.max(Map.Entry.comparingByValue());
return maxEntryOpt.map(Map.Entry::getKey);
63. ガイドライン
• G1 役に立つ情報を表す変数名を使うこと
• G2 ローカル変数のスコープを制限すること
• G3 初期化の文だけから型が分かる場合、var の利用を検討する
こと
• G4 連続の呼び出しを分解するために var を利用すること
• G5 ローカル変数の場合、インタフェースへのプログラミング
(”programming to the interface”) は気にしなくてもいい
64. ローカル変数の場合、インタフェースへのプ
ログラミング (”programming to the
interface”) は気にしなくてもいい
// ORIGINAL
List<String> list = new ArrayList<>();
// Inferred type of list is ArrayList<String>.
var list = new ArrayList<String>();
65. ガイドライン
• G1 役に立つ情報を表す変数名を使うこと
• G2 ローカル変数のスコープを制限すること
• G3 初期化の文だけから型が分かる場合、var の利用を検討する
こと
• G4 連続の呼び出しを分解するために var を利用すること
• G5 ローカル変数の場合、インタフェースへのプログラミング
(”programming to the interface”) は気にしなくてもいい
• G6 var をダイアモンドか generic メソッドと一緒に利用する時、
気を付けるこ
66. var をダイアモンドか generic メソッドと
一緒に利用する時、気を付けるこ
PriorityQueue<Item> itemQueue = new
PriorityQueue<Item>();
// OK: both declare variables of type PriorityQueue<Item>
PriorityQueue<Item> itemQueue = new PriorityQueue<>();
var itemQueue = new PriorityQueue<Item>();
// DANGEROUS: infers as PriorityQueue<Object>
var itemQueue = new PriorityQueue<>();
67. var をダイアモンドか generic メソッドと
一緒に利用する時、気を付けるこ
// DANGEROUS: infers as List<Object>
var list = List.of();
// OK: itemQueue infers as PriorityQueue<String>
Comparator<String> comp = ... ;
var itemQueue = new PriorityQueue<>(comp);
// OK: infers as List<BigInteger>
var list = List.of(BigInteger.ZERO);
68. ガイドライン
• G1 役に立つ情報を表す変数名を使うこと
• G2 ローカル変数のスコープを制限すること
• G3 初期化の文だけから型が分かる場合、var の利用を検討する
こと
• G4 連続の呼び出しを分解するために var を利用すること
• G5 ローカル変数の場合、インタフェースへのプログラミング
(”programming to the interface”) は気にしなくてもいい
• G6 var をダイアモンドか generic メソッドと一緒に利用する時、
気を付けること
• G7 var をリテラルと一緒に利用する時、気を付けること
69. var をリテラルと一緒に利用する時、気
を付けること
// ORIGINAL
boolean ready = true;
char ch = '¥ufffd';
long sum = 0L;
String label = "wombat";
// GOOD
var ready = true;
var ch = '¥ufffd';
var sum = 0L;
var label = "wombat";
101. JEP 316
Heap Allocation on Alternative Memory Devices
picture by Trolomite - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45277623
DAX ファイルシステム経由の
NVDIMMメモリアクセス
-XX:AllocateHeapAt=path
102. JEP 316
Heap Allocation on Alternative Memory Devices
picture by Trolomite - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45277623
DAX ファイルシステム経由の
NVDIMMメモリアクセス
-XX:AllocateHeapAt=path
1.mkstemp(filename)
103. JEP 316
Heap Allocation on Alternative Memory Devices
picture by Trolomite - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45277623
DAX ファイルシステム経由の
NVDIMMメモリアクセス
-XX:AllocateHeapAt=path
1.mkstemp(filename)
2.unlink(filename)
104. JEP 316
Heap Allocation on Alternative Memory Devices
picture by Trolomite - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45277623
DAX ファイルシステム経由の
NVDIMMメモリアクセス
-XX:AllocateHeapAt=path
1.mkstemp(filename)
2.unlink(filename)
3.posix_fallocate(fd, ofset, size);
105. JEP 316
Heap Allocation on Alternative Memory Devices
picture by Trolomite - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45277623
DAX ファイルシステム経由の
NVDIMMメモリアクセス
-XX:AllocateHeapAt=path
1.mkstemp(filename)
2.unlink(filename)
3.posix_fallocate(fd, ofset, size);
4.mmap(base, size, PROT_READ |
PROT_WRITE, MAP_SHARED |
MAP_FIXED, fd, 0)
106. JEP 317
Experimental Java-Based JIT Compiler
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
HotSpot Runtime
Graal GC
By anonymous medieval illuminator; Public Domain, https://commons.wikimedia.org/w/index.php?curid=2856329
107. JEP 319
Root Certificates
• Oracle JDK • OpenJDK
cacertscacerts
Secom Trust Systems
Let's Encrypt
Digicert Inc.
DocuSign
その他
108. JEP 319
Root Certificates
• Oracle JDK • OpenJDK
cacerts
Secom Trust Systems
Let's Encrypt
Digicert Inc.
DocuSign
その他
cacerts
Secom Trust Systems
Let's Encrypt
Digicert Inc.
DocuSign
その他
109. JEP 322
Time-Based Release Versioning
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) Server VM (build 9.0.4+11, mixed mode)
java version "10" 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+45)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+45, mixed mode)
110. JEP 322
Time-Based Release Versioning
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) Server VM (build 9.0.4+11, mixed mode)
java version "10" 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+45)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+45, mixed mode)
111. JEP 322
Time-Based Release Versioning
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) Server VM (build 9.0.4+11, mixed mode)
java version "10" 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+45)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+45, mixed mode)