Java 11
JLSに沿うように実装を
修正したら、様々なツールが
壊れた回
11
● A change around
try-with-resources
● JEP 181: Nest-Based Access
Control
● JEP 336: Deprecate the
Pack200 Tools and API
Slide 12
Slide 12 text
Dead code in $closeResource()?
Java 9で導入された手法にもデッドコードがあるということでより効率的な方法をJava 11
b07で導入したところ、JaCoCoとSpotBugsで誤作動が発生。JaCoCoは修正済みだが
SpotBugsは4.2.2時点で一部のみ対応。
SpotBugsが誤検知した内容は「nullじゃないとわかっているローカル変数のnullチェック
をしている」。Eclipseのコンパイラ(ecj)では問題なし。
バイトコードを見てみると、確かにインスタンスのメソッドを利用したあとで、そのインスタン
スがnullかどうか確認している。javacのバグでは?
12
Slide 13
Slide 13 text
SpotBugsにはOpenJDKのコミッタがいませんが、Issueで議論していた人の中にいた
Ismael Juma氏がcompiler-devメーリスで代わりに聞いてくれました。
spotBugs and JDK-8194978: Javac produces dead code for try-with-resource
その結果、驚愕の事実が判明。
OpenJDKコミッタじゃなくてもなんとかなるよ
13
そのほかのJava 11の変更
● JEP 181: Nest-Based Access Controlについてはじゅくちょー氏のブログに詳しい
ので割愛。SpotBugsでの修正はこちら。
● JEP 336: Deprecate the Pack200 Tools and APIはバイトコードの変化ではない
が、JaCoCoに影響を及ぼしたということでここに載せておきます。
16
Slide 17
Slide 17 text
Java 14
OpenJDKとコミュニティが協調した
模範的な事例
● JEP 305: Pattern Matching for
instanceof (Preview)
● JEP 359: Records (Preview)
17
Slide 18
Slide 18 text
Pattern Matching:ことの発端
Number number = 1f;
if (number instanceof Float f) {
System.out.println(
"number is a float: " + f
);
}
一見問題なさそうなコードだが、 SpotBugsではロー
カル変数を自分自身と比較している という警告が出
る。
JaCoCoではカバレッジの異常として報告される。
Eclipseのコンパイラ(ecj)では問題なし。
18