SlideShare una empresa de Scribd logo
1 de 71
Descargar para leer sin conexión
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java ヂカラ
日本オラクル株式会社
オラクルユニバーシティ
ビジネス推進部
岡田 大輔
2018 年 11 月 16 日
Java プログラミングのこれまでとこれから。
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、
情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。
以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するもの
ではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関
して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決
定されます。
Oracle と Java は、Oracle Corporationおよびその子会社、関連会社の米国おそびその他の国における登録商標です。
文中の社名、商品名等は各社の商標または登録商標である場合があります。
2
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Duke, the Java Mascot
Manifest the Future (FY15)
Cloud Master (FY16)
Future Builder (FY17)
Java 9 Builder (FY18)
Classic Duke
Duke のデザイン
Duke はオープンソース (BSD ライセンス) なのでBSDラインセンス下であれば
自由にデザインを改変可能ですが、オラクルでは、通年で使用可能な Classic
Duke と毎年異なるデザインの Annual Duke のみを使用しています。(単なる
社内ルールなのですが…。) 新デザインは毎年秋頃に米国サンフランシスコ
で開催される Oracle Code One で発表されます。
3
Java Duke Racer (FY19)
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
本日お話したいこと
はじめに: Java プログラミングのこれまでとこれから
つぎに: Java プログラミングのこれまでとこれから
最後に: Oracle University 教育サービスご紹介
1
2
3
4
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java プログラミング。
ちゃんとできますか?
Java プログラミングのこれまでとこれから。
前編
5
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
質問。
現在お使いの
Java のバージョンはどれですか?
では、現在無償で利用可能な
Java のバージョンは?
6
• Java は Oracle JDK または OpenJDK 環境を指します。
• 無償で利用可能 = Public Update が提供されていることとします。
セキュリティパッチの適用なしで運用したりしませんよね?
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 7
Java SE のあゆみ
• 1996
• Java 誕生
• 1998
• Collections
• 2002
• JCP
• 2006
• JVMTI
• 2014
• Lambda
• 1997
• JDBC
• 2000
• HotSpot
• 2004
• Generics
• 2011
• Oracle 買収
• 2017/9/21
• Module System
1.0 1.2
1.1 1.3
1.4
5.0
6
7
8
9
無償サポート終了
無償サポート終了
現行バージョン
無償サポート終了
• 2018/3/20
• var
(Local Variable Type Interface)
10
無償サポート終了
• 2018/9/25
• LTS Release
11
現行バージョン
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
おさらい: Java SE 8 までの主な新機能
• Java SE 5 (2004.5 )
– BigDecimal クラスによる浮動小数点演算の強化
– 総称型 (Generics) の追加によるコンパイラによる型安全性の向上
– 注釈 (Annotation) によるメタデータ機能の追加
– 列挙型 (enum)、オートボクシング・アンボクシング、拡張 for 文、静的イン
ポート、可変長引数による拡張
– Unicode 4.0 および補助文字サポート
– JAR ファイルの高圧縮形式(Pack200)サポート
• Java SE 7 (2011.7)
– Project Coin (JSR 334)
– InvokeDynamic (JSR 292)
– NIO.2 (JSR 203)
– JDBC 4.1
– Fork-Join フレームワーク (JSR
166y)
– JAXP, JAXB, JAX-WSの更新
– JavaFX 2.0
– ClassLoader の改善
– G1GC の導入
• Java SE 6 (2006.12)
– AWT、Swingの高速化
– JDBC 4.0
– JAXP (Java API for XML
Processing) 1.4
– Executors フレームワーク
(JSR166)
– Webサービス
– Windows システムトレイの
サポート
– Windows Aero のルック・
アンド・フィール
– テキストのUnicode正規
(java.text.Normalizer)
• Java SE 8 (2014.3)
– Project Lambda
• ラムダ式 (JSR 335)
• Stream API
– Type Annotation (JSR 308)
– Date and Time API (JSR 310)
– 高速 JavaScript エンジン (Nashorn)
– JavaFX 8
– Hotspot と JRockitの統合
8
ラムダ式は言語仕様の変更を伴う
重要な新機能
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java SE 9 の主要な新機能と機能変更
BehindthescenesNewfunctionality
SpecializedNewstandards
HousekeepingGone
• Store Interned Strings in CDS Archives
• Improve Contended Locking
• Compact Strings
• Improve Secure Application Performance
• Leverage CPU Instructions for GHASH and RSA
• Tiered Attribution for javac
• Javadoc Search
• Marlin Graphics Renderer
• HiDPI Graphics on Windows and Linux
• Enable GTK 3 on Linux
• Update JavaFX/Media to Newer Version of GStreamer
• Jigsaw –Modularize JDK
• Enhanced Deprecation
• Stack-Walking API
• Convenience Factory Methods for Collections
• Platform Logging API and Service
• jshell: The Java Shell (Read-Eval-Print Loop)
• Compile for Older Platform Versions
• Multi-Release JAR Files
• Platform-Specific Desktop Features
• TIFF Image I/O
• Multi-Resolution Images
• Process API Updates
• Variable Handles
• Spin-Wait Hints
• Dynamic Linking of Language-Defined Object Models
• Enhanced Method Handles
• More Concurrency Updates
• Compiler Control
• HTTP 2 Client
• Unicode 8.0
• UTF-8 Property Files
• Implement Selected ECMAScript 6 Features in Nashorn
• Datagram Transport Layer Security (DTLS)
• OCSP Stapling for TLS
• TLS Application-Layer Protocol Negotiation Extension
• SHA-3 Hash Algorithms
• DRBG-Based SecureRandom Implementations
• Create PKCS12 Keystores by Default
• Merge Selected Xerces 2.11.0 Updates into JAXP
• XML Catalogs
• HarfBuzz Font-Layout Engine
• HTML5 Javadoc
• Parser API for Nashorn
• Prepare JavaFX UI Controls & CSS APIs for Modularization
• Modular Java Application Packaging
• New Version-String Scheme
• Reserved Stack Areas for Critical Sections
• Segmented Code Cache
• Ahead-of-Time Compilation
• Indify String Concatenation
• Unified JVM Logging
• Unified GC Logging
• Make G1 the Default Garbage Collector
• Use CLDR Locale Data by Default
• Validate JVM Command-Line Flag Arguments
• Java-Level JVM Compiler Interface
• Disable SHA-1 Certificates
• Simplified Doclet API
• Deprecate the Applet API
• Process Import Statements Correctly
• Annotations Pipeline 2.0
• Elide Deprecation Warnings on Import Statements
• Milling Project Coin
• Filter Incoming Serialization Data
• Remove GC Combinations Deprecated in JDK 8
• Remove Launch-Time JRE Version Selection
• Remove the JVM TI hprof Agent
• Remove the jhat Tool
JDK 9 で
デフォルトになった
機能
新しく追加
された機能/
ツール群
新しい
技術標準への
対応
変更を必要と
する高度な
新機能
ライブラリの
改善や内部的な
実装変更など
JDK 9 で
削除されたもの
9
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java SE 10 (18.3) の主要な新機能と変更点
• JEP 286: Local-Variable Type Interface
– ローカル変数の型推論
10
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
var は、予約語ではなく型名 (var というクラス)
• var var = 1; は可能
• 既存クラスに var クラスが存在する場合は要注意
(Java の命名規則などを考えると var クラスは存在しないと思いたい…)
• JEP 307: Parallel Full GC for G1
G1 GC のフルGC を並列化
• JEP 313 Remove Native-Header Generator Tool
javah の削除 (javac で代替可能)
• JEP 314: Additional Unicode Language Extensions
java.util.Locale 他で BCP47 言語タグの Unicode 拡張を実装
• JEP 322: Time-Based Release Versioning
時間ベースのリリースに対応したバージョン記述
$FEATURE.$INTERIM.$UPDATE.$PATCH
(6 ヶ月ごとのリリースで $FEATURE が増え、メンテナンスリリースで $UPDATE が
増える。$INTERIM は原則として 0)
• JEP 296: Consolidate the JDK Forest into Single Repository
OpenJDK のリポジトリを統合
• JEP 301: Application Data-Class Sharing
クラスデータ共有(CDS) をアプリケーションクラスでも使用可能に
• JEP 312: Thread-Local Handshakes
VM 全体のセーフポイントを使用せずに個々のスレッドでコールバックを
実行する方法を提供
• JEP 204: Garbage Collector Interface
JVM から GC を独立させるためのインタフェース
• JEP 316: Heap Allocation on Alternative Memory Device
NV-DIMM などの代替メモリー・デバイスに Java オブジェクト・ヒープを割当て可能に
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java SE 11 (18.9) の主要な新機能と変更点
• JEP 323: Local-Variable Syntax for Lambda Parameters
– ローカル変数の型推論がラムダ式でも使用可能に
11
list.stream().map((var s) -> s.toLowerCase())
.collect(Collectors.toList());
• JEP 330: Launch Single-File Source-Code Programs
> java HelloWorld.java が可能に!
• JEP 321: HTTP Client (Standard)
Java SE 9 で Incubator Module だったものが標準化
• JEP 327: Unicode 10
Unicode 10 をサポート。
… ということは、.properties ファイルで絵文字を使用可に!
• JEP 320: Remove The Java EE and CORBA Modules
Java SE に同梱されていた JAX-WS, JAXB, CORBA 関連のモジュールを削除
• JEP 335: Deprecate the Nashorn Scripting Engine
Java SE 8 で導入された Nashorn は今後削除される。
今後は GraalVM の使用を推奨。
• JEP 318: The Epsilon Garbage Collector
“no-op” ガベージコレクタ。メモリ回収を行わない。
Experimental なので使用できるシーンは限られる
• JEP 333: ZGC A Scalable, Low Latency Garbage Collector
Pauseless GC。大規模メモリ環境で低レイテンシが求められる場合に有効だがこ
れも Experimental。利用の際は要事前検証。
• JEP 332: Transport Layer Security (TLS) 1.3
TLS 1.3 をサポート
• JEP 328: Flight Recorder
Oracle JDK の商用機能だった超高性能プロファイラがオープンソース化。
この機能が役に立つのはこういう場合
(ラムダ式で var を使った引数に注釈 (Type Annotation)を追加できる)
list.stream()
.map((@Notnull var s) -> s.toLowerCase())
.collect(Collectors.toList());c
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
今ドキの Java でかけますか?
ところで。
Java 書けてますか?
12
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
• よくあるコード • 状況
– Item クラスをカプセル化してアクセサメソッド
(setter/getter)を実装。
• 何が問題?
– インスタンス変数の値をアクセサメソッドを介し
てかんたんに取得できると、振るまいはインス
タンス変数とは別の場所に実装されてしまう
• 責務の分割が不十分に
• 結果としてコードの重複などが発生しやすい
13
ウォーミングアップ: オブジェクト指向プログラミング
こんなコード書いていませんか? - その 1
1. public class Main {
2. public void method(Item item) {
3. int value = item.getAmount();
4. item.setAmount(value + 1);
5. }
6. }
7. public class Item {
8. private int amount;
9. public void setAmount(int amount) {
10. this.amount = amount;
11. }
12. public int getAmount() {
13. return amount;
14. }
15. }
Itemクラスとは別の場所に
振るまいが実装されている
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
• こう書く。 • どう書く?
– 別のクラスで実装していた振るまいを
Item クラスの振るまいとして実装する
(単一責任の原則)
14
ウォーミングアップ: オブジェクト指向プログラミング
クラスの責務を考えた実装とは?
1. public class Main {
2. public void method(Item item) {
3. item.addAmount(1);
4. }
5. }
6. public class Item {
7. private int amount;
8. public void addAmount(int value) {
9. amount = amount + 1;
10. }
11. } Tips:
基本ルールは「求めるな。命じよ。」
インスタンス変数に対する単純なアクセサメソッドの公開は本
当に必要なのか?を確認
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
今までの経験があれば対処できる?
• Java でサマータイムを扱うには?
– Date and Time API (Java SE 8 〜)
• java.time.ZonedDateTime … タイムゾーン付で日付と時刻を扱うクラス
実務経験だけでは対処が難しいことも
1. LocalDateTime localDateTime = LocalDateTime.parse("2018-11-04T01:59:59");
2. ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("America/New_York"));
3. System.out.println(localDateTime + "->" + zonedDateTime);
4. System.out.println(localDateTime.plusSeconds(2L) + "->" + zonedDateTime.plusSeconds(2L));
[出力結果]
2018-11-04T01:59:59->2018-11-04T01:59:59-04:00[America/New_York]
2018-11-04T02:00:01->2018-11-04T01:00:01-05:00[America/New_York]
[注]:
java.time.ZonedDateTime は JDK 付属の tz database を参照するため、IANA 管理の tz database 情報の
反映にタイムラグがある (更新には JDK の更新 or Time Zone Updater Tool を使用)。
また、他の実装系との整合性を取るために java.time.OffsetDateTime を使うケースもあり。この場合は夏時間
の適用ルール (ZonedRules) を実装した java.time.TemporalAjduster を用意する必要がある。
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
1. public class JDTAdjuster implements TemporalAdjuster {
2. // 定数宣言
3.
4. @Override
5. public Temporal adjustInto(Temporal temporal) {
6. if (!(temporal instanceof OffsetDateTime)) {
7. throw new IllegalArgumentException(temporal
8. + "is not an instance of java.time.OffsetDateTime");
9. }
10. OffsetDateTime offset = (OffsetDateTime) temporal;
11. if ((offset.getYear() >= JDT_START_YEAR) && isInSummerTime(offset))
12. return offset.withOffsetSameInstant(ZoneOffset.ofHours(DST_OFFSET));
13. return offset.withOffsetSameInstant(ZoneOffset.ofHours(REGULAR_OFFSET));
14. }
15.
16. private boolean isInSummerTime(OffsetDateTime offsetDateTime) {
17. // Daylight Saving Time の判定
18. }
19. }
16
TemporalAdjuster を使って夏時間適用ルールを自前で実装する
今ドキの Java ならこんな書き方:
サマータイムを扱うには?
この TempralAdjuster を使用するには次のように書く
TemporalAdjuster jdtAdjuster = new JDTAdjuster();
OffsetDateTime offsetDateTime =
OffsetDateTime.parse("2020-05-10T02:00:01+09:00");
System.out.println(offsetDateTime + " -> "
+ offsetDateTime2.with(jdtAdjuster));
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
1. private List fileToList(String fileName) throws Exception {
2. String line;
3. List lines = new ArrayList();
4. BufferedReader reader = null;
5. try {
6. reader = new BufferedReader(new FileReader(fileName));
7. while((line = reader.readLine()) != null) {
8. lines.add(line);
9. }
10. reader.close();
11. } catch(Exception e) {
12. throw new CustomException();
13. }
14. return lines;
15. }
17
「ファイルの全行を読み込む」: J2SE 1.4 相当の知識で何となく書くと…
今ドキな書き方はバージョンによっても変わる:
こんなコード書いていませんか?
どのチェック例外が発生するかわからない …
カスタム例外だけをスローするとエラーの原因がわからない
( → エラーの原因が隠蔽されると保守性が低下する)
総称型を使っていない (→ 型安全でない)
例外が発生すると reader は close されずリークの遠因に
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
1. private List<String> fileToList(String fileName) throws CustomSystemException {
2. List<String> lines = new ArrayList<String>();
3. BufferedReader reader = null;
4. try {
5. reader = new BufferedReader(new FileReader(fileName));
6. String line = null;
7. while(reader.readLine() != null) {
8. lines.add(line);
9. }
10. } catch (FileNotFoundException e) {
11. throw new CustomSystemException(FILE_NOT_FOUND, e);
12. } catch(IOException e) {
13. throw new CustomSystemException(FILE_READ_ERROR, e);
14. } finally {
15. try {
16. if (reader != null) reader.close();
17. } catch(IOException e) {
18. System.out.println("ERROR at closing Reader: " + e.getMessage());
19. }
20. }
21. return lines;
22. }
18
今ドキな書き方はバージョンによっても変わる:
当時は「正しい」とされた書き方
発生するチェック例外を明示
総称型を使う
try-catch では finally 句でのリソースクローズ処理が必須
(→ 実装時にテスト必須)
カスタム例外に翻訳する場合は、発生源の例外情報も含める
「ファイルの全行を読み込む」: Java SE 6 相当の知識で書くと…
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
今ドキな書き方はバージョンによっても変わる:
新しい機能を適切に使う
「ファイルの全行を読み込む」: Java SE 7 ではスッキリ書ける
1. private List<String> fileToList(String fileName) throws CustomException {
2. List<String> lines = new ArrayList<>();
3. try(BufferedReader reader = new BufferedReader(new FileReader(filename))) {
4. String line;
5. while((line = reader.readLine()) != null) {
6. lines.add(line);
7. }
8. } catch(FileNotFoundException e) {
9. throw new CustomException(FILE_NOT_FOUND, e);
10. } catch(IOException e) {
11. throw new CustomException(FILE_READ_ERROR,e);
12. }
13. return lines;
14. }
総称型 + ダイヤモンド演算子を使用 (型安全性)
try-with-resources でリソースは自動クローズ
( → リソースのクローズは API レベルで担保)
19
バージョン毎に適した Java プログラミングを正しく行うことで
見通しのよい、保守性の高いコード
を書くことができる
= 実装・テスト工数を削減 することができる
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
try-with-resources のコード例
• JSR 334: Project Coin
1. Switch 文での String の使用
2. Multi-catch
3. try-with-resrouces 文
4. ダイヤモンド演算子
5. アンダースコア付きリテラルとバイナリリテラ
ル
20
おさらい: Java SE 7 の新機能
class MyResource implements java.lang.AutoCloseable {
@Override
public void close() throws Exception {
// ...
}
}
try (MyRecourse r1 = new MyResrouce();
MyResource r2 = new MyResoruce() ) {
// ...
} catch(MyException1 | MyException2 e) {
e.printStackTrace();
}
Reader/Writer などの File I/O 関連 API や JDBC API (Java SE 7 以上)、
および Stream API (Java SE 8) は AutoCloseable 対応
複数のリソースをオープンする場合は、
セミコロンで区切る
(クローズはオープンと逆順)
catch 句の処理内容が同じ場合はまとめて
記述することができる
(Multi-catch)
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
今ドキな書き方はバージョンによっても変わる:
バージョンごとに適切な API を使う
「ファイルの全行を読み込む」: Java SE 7 NIO.2 を利用する
1. private List<String> readFile(String filename) {
2. try {
3. return Files.readAllLines(Paths.get(filename), Charset.defaultCharset());
4. } catch (IOException e) {
5. throw new SytemException(FILE_READ_ERROR, e);
6. }
7. }
21
Java SE 7 の NIO.2 ではファイルのすべての行を読み込むためのメソッドが API として提供されている
= さらに実装・テスト工数を削減可能
• メソッド呼び出しのみでファイル読み込み処理を実装できてテストは原則として不要
• 万が一実装に問題がある場合もパッチ適用で改善可能
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
おさらい: Java SE 8 の新機能
関数型プログラミング in Java
• 関数型プログラミング (Functional Programming) is …
• 関数 is …
• 関数型プログラミングと Java :
– Java SE 8 からは 関数型プログラミングの要素が取り入れられた
• コア API (コレクション・フレームワークなど) に関数型プログラミングをサポートするメソッドが追加
された (Collection::removeIf や List::replaceAll など)
• 関数スタイルでデータ処理を行うための API が追加された (Stream API)
22
関数を使って (つなぎ合わせて) プログラミングすること
入力に対して一意の出力を持つ処理
関数の評価が他に影響を及ぼさない
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
• これは関数 • これは関数 … ではない
23
関数 is 何? - コードで確認
1. public class Calc {
2. private int x; // メソッドの影響を受けない
3. public int multiply(int a, int b) {
4. return a * b;
5. }
6. }
1. public class Calc {
2. private int x;
3. public int multiply(int y) {
4. return x *= y; // 変数に影響する
5. }
6. }
⭕ 入力に対して一意の出力を返す
⭕ 関数の評価が他に影響を及ぼさない
⭕ 入力に対して一意の出力を返さない
⭕ 関数の評価が他に影響を及ぼす
関数を使うほうがコードの安全性を保ちやすくテストもしやすい
互いが依存しないので並列プログラミングにも向いている
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
関数のもう一つの特性
• 関数を引数として扱うことができる (高階関数)
– 関数を引数で渡すときの書き方がラムダ式
– 関数を引数で渡す?
• Java はオブジェクト指向プログラミング言語なので関数 (メソッド) をそのまま渡せない
• 関数をあらわすオブジェクト作った = 関数型インタフェース
– 関数の入力と出力をインタフェースメソッドとして記述する
– Java SE 8 のコア API として汎用関数型インタフェース (java.util.function パッケージ) を提供
24
list.stream().filter(data -> data.contains("c")).forEach(System.out::print);
メソッド引数として「関数」を渡している
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
関数型インタフェース
• 単一の abstract メソッドを持つインタフェース (SAM インタフェース)
– static メソッドやデフォルトメソッド、private メソッドは定義可能
– java.lang.Object クラスの public メソッドも定義可能
25
One Point: Java SE 8 と Java SE 9の新機能
(インタフェース関連)
• static メソッド (SE 8 〜)
• static キーワードを使用して宣言された
メソッド
• オーバーライド不可 (継承されない)
• メソッド呼び出し方法:
InterfaceType.method();
• デフォルトメソッド (SE 8 〜)
• default キーワードを使用して宣言された
メソッド
• デフォルトメソッドの解決ルール:
• スーパークラス > インタフェース
• サブタイプ > スーパータイプ
• 競合した場合は、実装クラスでオーバーライド
• private メソッド (SE 9 〜)
• default メソッドから呼び出し可能な実装メソッ
ド
• 実装クラスからは呼び出せない
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
関数型インタフェース
• これは関数型インタフェース?
26
1. @FunctionalInterface
2. public interface MyFunction {
3. private void hello() {
4. System.out.println("Hello Static!!");
5. };
6. int calc(int a, int b);
7. String toString();
8. }
private メソッド
(Java SE 9 〜)
これは
関数型インタフェース
Object クラスの public メソッド
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
ラムダ式
• 関数型インタフェースを実装するクラスのインスタンス化を簡略化するた
めの構文
– 関数型インタフェースのメソッドにフォーカスして実装を記述できる
27
(x, y) -> x + y
x + y を返す
(メソッド本体)
x と y を引数にとって
(引数リスト)
 メソッド名はどうやって決まる?
→ 関数型インタフェースは、SAM インタフェースなので実装するメソッドの名前や引数
の型、戻り値はひとつだけ。だから推論可能。
 変数 x と変数 y はどこで宣言している?
→ ラムダ式中の x や y は引数名をあらわす。(任意の変数名をつけて OK)
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
• ソート処理の実装で考えてみる (java.util.Comparator = 関数型インタフェース)
– 無名クラスでインスタンス化
– ラムダ式だとこうなる
1. Arrays.sort(array, (String a, String b) ->
{ return a.compareToIgnoreCase(b); } );
1. Arrays.sort(array, new Comparator<>() {
2. @Override
3. public int compare(String a, String b) {
4. return a.compareToIgnoreCase(b);
5. } } );
ラムダ式は何を簡略化している?
28
注意: 無名クラスを使った実装とラムダ式を使った実装は厳密には同じではありません。ラムダ式になれるための中間思考としてとらえてください。
クラス
変数
メソッド
メソッド
無名クラスのイメージ
ラムダ式のイメージ
Java SE 9: 無名クラスでも
ダイヤモンド演算子を使える
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
• 無名クラス
– コンパイルするとクラスファイルが生成
される (X$1.class)
• ラムダ式
– コンパイルしてもクラスファイルが生成
されない
– ラムダ式をあらわすコードは動的に生
成される (InvokeDynamic)
29
閑話休題: バイトコード (CAFEBABE) の世界
public static void main(java.lang.String...);
Code:
0: iconst_4
// (省略)
26: invokedynamic #7, 0 // InvokeDynamic #0:compare:()Ljava/util/Comparator;
31: invokestatic #8 // Method java/util/Arrays.sort:([Ljava/lang/Object;Ljava/util/Comparator;)V
34: return
private static int lambda$main$0(java.lang.String, java.lang.String);
Code:
0: aload_0
1: aload_1
2: invokevirtual #9 // Method java/lang/String.compareToIgnoreCase:(Ljava/lang/String;)I
5: ireturn
ラムダ式のバイトコード
ラムダ式は、コンパイル対象のクラスのメソッドとしてコンパ
イルされる
• this はコンパイル対象のクラスを指す
• クラスは実行時に invokedynamic によってオンメモリで生成される
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Stream API とは?
• データをパイプライン形式で処理するための API (Java SE 8 〜)
– ストリームに対して関数操作を行った結果をストリームで返す (中間操作)
– 処理結果をデータとして返す (終端操作)
• 中間操作も終端操作もメソッド引数は関数型インタフェースを取るものが多い
30
Stream の生成 中間操作 終端操作
Stream.of()
Arrays.stream(T)
Collection.stream()
…
※ 中間操作は遅延評価
forEach()
reduce()
collect()
max(),min(),average()
count(),sum()
…
filter()
map()
flatMap()
peek()
…
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
今ドキな書き方はバージョンによっても変わる:
バージョンごとに適切な API を使う
「ファイルの全行を読み込む」: Java SE 8 NIO.2 は Stream を返せる
1. private Stream<String> readFile(String filename) {
2. try {
3. return Files.lines(Paths.get(filename), Charset.defaultCharset());
4. } catch (IOException e) {
5. throw new SytemException(FILE_READ_ERROR, e);
6. }
7. }
31
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
今ドキな書き方はバージョンによっても変わる:
バージョンごとに適切な API を使う
Stream API でファイルに含まれる単語を抽出してみる
1. Stream<String> content = readFile("path_to_file");
2. var words = content.flatMap(line -> Stream.of(line.split(“ ”))) // スペースを区切り文字にして要素をストリームに
.filter(word -> word.length() > 3) // 長さが 3 より大きい単語を抽出
.map(String::toLowerCase) // ストリームの要素を小文字に
.distinct() // 重複除外
.sorted((x, y) -> x.length() - y.length()) // 文字数が短い順にソート
.collect(Collectors.toList()); // 各要素を List に格納して返す
32
Java SE 10: ローカル変数の
型名は推論可能
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
まとめ: 関数型プログラミング in Java
• Java SE 8 で関数を扱うために関数型インタフェースを提供している
– 目的は安全なコードを早く、効率的に記述したい
• オブジェクト指向プログラミングだけで用が足りるならそれで OK
でも昨今の開発事情を考えるとたぶんそれは厳しい
– テストを効率化したい!
– 並列処理を効率化したい!
– より安全にシンプルなコードを書きたい!
– 関数型インタフェースをインスタンス化するためにラムダ式を使える
• Collection や Stream API では関数オブジェクトを引数に取る処理が追加された
– 使わなくても同じようなコードを書けるけど煩雑
– 関数型プログラミングを考え方を理解していないと API を活用できない
• Java プログラミングの基礎知識は必須。コードも読めないし書けない
33
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
前編のまとめ
• スキルアップ。必要です。
–Java は時代とともに必要な機能を取り入れて進化し続けています
–あたらしい機能は、あたらしいバージョンで提供されます
• 言語仕様の変更や追加をともなう変更点はとくに。
–知識が古いままだと新機能の利点を享受できない場合も
34
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java SE のリリースサイクル
Java プログラミングのこれまでとこれから。
後編
35
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 36
Java SE のあゆみ (再掲)
• 1996
• Java 誕生
• 1998
• Collections
• 2002
• JCP
• 2006
• JVMTI
• 2014
• Lambda
• 1997
• JDBC
• 2000
• HotSpot
• 2004
• Generics
• 2011
• Oracle 買収
• 2017/9/21
• Module System
1.0 1.2
1.1 1.3
1.4
5.0
6
7
8
9
無償サポート終了
無償サポート終了
現行バージョン
無償サポート終了
• 2018/3/20
• var
(Local Variable Type Interface)
10
無償サポート終了
• 2018/9/25
• LTS Release
11
現行バージョン
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 37
Java って
有償化したの?
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 38
Java Is Still Free
参考: Java Is Still Free / 日本語訳: Java は今も無償です
• 有償化したの?
– 今まで通り最新版の無償更新は入手可能です
– 今まで通り無償期間に取得したものはそのまま継続して利用可能です
– 今まで通り年4回の更新版 (1, 4, 7, 10 月)を適用できます
• Java アプレットは2019年1月(有償版は3月)で終了?
– Java Plugin の定期更新は終了します
• そもそも、主要ブラウザベンダーは年内でサポート終了の可能性が…
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
課題
1. 大規模な機能の完成まで度々延期されるリリース
2. リリースされず蓄積している完成した中小の機能
3. 制限のある無償版の再配布
リリースに対する要望
1. 完成した機能は計画的に素早くリリース
2. シンプルかつ再配布可能な無償版のライセンス体系
39
リリースモデルの変更に至る背景:
JDK 9 までの課題と今後のリリースへの要望
24
55
91
12
17
0
20
40
60
80
100
JDK 7 JDK 8 JDK 9 JDK 10 JDK 11
2011年7月 2014年3月 2017年9月 2018年3月 2018年9月
JDK 9は過去最多の機能追加
3年6ヶ月
2年8ヶ月
6ヶ月 6ヶ月
LambdaCoin Jigsaw
JDK7 Plan B
JDK7 Plan A
Coin Coin
Lambda
JDK8 Plan B
Jigsaw
JDK9
Milling
Coin
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
従来のモデル
メジャー・リリース
2年に一回機能追加 (目標)
• 実際には不定期
(8は8ヶ月遅れ、9は1年6ヶ月遅れ)
リリース内容
• 仕様書
• 互換テスト
• リファレンス用ソースコード
ベンダー各社によるバイナリ生成
新しいモデル
フィーチャー・リリース
6ヶ月に一回機能追加 (固定)
リリース内容
• 仕様書
• 互換テスト
• リファレンス用ソースコード
(Oracleの商用機能も含む)
ベンダー各社によるバイナリ生成
あたらしい Java SE リリースモデル
40
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
計画的なリリースに:
Java SE の新しいリリース・モデル
3年6ヶ月
2年8ヶ月
Java SE 7
Java SE 8
2014年
3月
2011年
7月
2017年
9月
9
10
11
12
13
14
15
16
17
18
19
3月 9月 3月 3月9月 9月 3月 9月 3月 9月
2018年 2019年 2020年 2021年 2022年
3年に一度のバージョンに
LTS (Long Time Support)を設定
6カ月に一度
機能追加
完成した機能
からリリース
定期的
不定期
大規模な機能の実装の
完成に左右されていた
完成している
中小の機能は
待機
41
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
従来のモデル
メジャー・リリース
後継版リリース後およそ1年間無償更新
年4回のリリース (1月,4月,7月,10月)
商用機能は利用不可
ライセンス: Oracle BCL (Binary Code License)
ダウンロード: http://www.oracle.com
新しいモデル
フィーチャー・リリース
後継版リリースまで無償更新
年6回のリリース (1月,3月,4月,7月,9月,10月)
• 3月と9月に機能追加
商用機能も利用可能
ライセンス: GPLv2 + Classpath Exception
• 公式 OpenJDK バイナリ
ダウンロード: http://jdk.java.net
なにが提供されるの?:
Oracle が配布する無償用バイナリ
42
Java 11 以降の Oracle JDK
OTN ライセンス下で無償利用可能。
ダウンロードは OTN から
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Oracle が配布するバイナリの更新サイクル
9
9
9
10
10
10
Java SE 11 LTS (18.9) (有償更新)
11
12
12
13
13
14
14
15
15
16
16
Java SE 17 LTS (21.9) (有償更新)
17
18
18
Java SE 8 (有償更新)
Java SE 7 (有償更新)
Java SE 6 (有償更新)
Java SE 8 無償更新 Non-corporate
3月 9月 3月 9月 3月 9月 3月 9月 3月 9月
2018年 2019年 2020年 2021年 2022年
2025年
3月
2026年
9月
2022年
7月
2018年
12月
2014年
3月
2019年
1月
2020年
12月
2017年
9月
6ヶ月に一度
機能追加
3年
8u20
(2014年8月)
8u40
(2015年3月)
8u60
(2015年8月)
限定機能追加
Interchangable:
Oracle JDK とOpenJDKの機能的差分をなくす
無償更新
有償更新
無償更新
OpenJDKビルド from Oracle
Oracle JDK バイナリ
43
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
OpenJDK で使用可能になる
Oracle JDK の商用機能
• Application Class-Data Sharing (Java SE 10)
– http://openjdk.java.net/jeps/310
• ZGC (Z Garbage Collector)
– http://openjdk.java.net/projects/zgc/
• Java Flight Recorder
– http://openjdk.java.net/jeps/328
• Java Mission Control
– http://openjdk.java.net/projects/jmc/
• Usage Logger
– 公開に向けて作業中
JDK 11 から Oracle が配布する
バイナリでサポートされない機能
• 含まれない機能
– 自動更新
– JavaFX (OpenJFX で引き続き利用可能)
– Java Web Start と Web ブラウザ用 Java plugin
• 利用できない形式
– 32ビット版バイナリ
– 単独のJRE (JDK から jlink を利用して生成)
44
Oracle が配布するバイナリの変更点
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Oracle のバイナリ・リリースのまとめ
現行のモデル 新しいモデル
無償版
機能の追加
メジャー・リリース
2年に一回 (目標) – 実際は不定期
フィーチャー・リリース
6ヶ月に一回 (固定)
コードの管理 バージョン毎のマルチラインで管理
シングルラインで管理
機能追加とメンテナンスを継続的に行う
定期更新
内容 メンテナンス + 限定機能更新 メンテナンスのみ
回数 年4回 (1月, 4月, 7月, 10月)
バイナリ
Oracle JDK
http://www.oracle.com/technetwork/java/javase/downloads/
• Oracle Binary Code License
• 商用機能除く
OpenJDK
http://jdk.java.net/
• GPLv2 + Classpath Exception
• JDK 8の商用機能も含む
長期サポート
(有償)
対象のリリース すべてのメジャー・リリース 3年ごとのフィーチャー・リリース
定期更新
期間 Oracle Lifetime Support Policy 準拠 (最低8年)
内容 メンテナンス + 限定機能更新 メンテナンスのみ
回数 年4回 (1月, 4月, 7月, 10月)
バイナリ Oracle JDK
https://support.oracle.com
45
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 46
使用中の JDK は
そのまま
使い続けられる?
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
考慮事項: ソフトウェアの脆弱性
対策をしていないシステムは狙われやすい
脆弱性修正済みパッチを適用するのが効果的な対策方法
47
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
いつまで公式アップデートは提供される?
公式アップデート終了のスケジュール
リリース 利用開始
(GA)
公式アップデート終了
の通知
公式アップデートの終了
(EoPU)
5.0 2004年5月 2008年4月 2009年10月
6 2006年12月 2011年2月 2013年2月
7 2011年7月 2014年3月 2015年4月
8 2014年3月 2017年9月 2019年1月
(non-corporate desktop use 2020年12月)
9 2017年9月 2017年9月 2018年3月
10 (18.3) 2018年3月 2018年3月 2018年9月
48
http://www.oracle.com/technetwork/java/eol-135779.html
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
最新バージョンへ
OpenJDKビルド from Oracle
49
公式アップデート終了後の更新版入手のオプション
商用ライセンスの購入
JDK 8 でバージョン固定
こちらがオススメ
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
最新バージョンへの乗り換えの前に…
利用する機能に依存する選択肢
• Java Plug-in と Applet の利用
– 有償版でも定期更新は2019年3月まで
– 動作している間に別のテクノロジーに移行することを推奨
• Java Web Start の利用
– 公式アップデート終了後、Java SE 8 の有償版で引き続き更新版の入手
– Java SE をバンドルしたアプリケーションとして配布することを推奨
• 32ビット版バイナリの継続利用
– 公式アップデート終了後、Java SE 8 の有償版で引き続き更新版の入手
50
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java の商用サポート期間
リリース
提供開始
(GA)
Premier
サポート終了
Extended
サポート終了
Sustaining
サポート
Java SE 5.0 2004年 5月 2011年 5月 2015年 5月 あり
Java SE 6 2006年12月 2015年12月 2018年12月 あり
JRockit 6 2009年 6月 2015年12月 2018年12月 あり
Java SE 7
2011年 7月
2019年 7月 2022年 7月 あり
Java SE 7 Deployment Technology 2016年 7月 設定なし あり
Java SE 8
2014年 3月
2022年 3月 2025年 3月 あり
Java SE 8 Java Web Start 2022年 3月 2025年 3月 あり
Java SE 8 Java Plug-in 2019年 3月 設定なし あり
Java SE 9 (non-LTS) 2017年 9月 2018年 3月 設定なし あり
Java SE 18.3 (10) (non-LTS) 2018年 3月 2018年 9月 設定なし あり
Java SE 18.9 (11) (LTS) 2018年 9月 2023年 9月 2026年 9月 あり
Java SE 19.3 (12) (non-LTS) 2019年 3月 2019年 9月 設定なし あり
51
https://www.oracle.com/us/assets/lifetime-support-middleware-069163.pdf
注: Deployment Technology: Java Plug-in と Java Web Start
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java SE 9 以降へのアップグレードを見据えた
これからの開発
• 非推奨 API の利用は避ける
– @Deprecated(“forRemoval=true“)となった API には特に気をつけよう
• 内部 API の利用は控え、Java Platform Module System に移行する
– アプリケーションのモジュール化は必須ではない
– 明記されている API のみを利用しよう
• https://docs.oracle.com/javase/10/docs/api/overview-summary.html
• 不要なモジュールは外す
• 利用しない新機能は気にしない
– アップデート・リリースは確認しよう
• 一つのJarファイルで複数の Java SE のバージョンに対応させる
• セキュリティ・ロードマップも確認
– https://www.java.com/en/jre-jdk-cryptoroadmap.html
52
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
• Module System (Jigsaw)
何のため?
JDK 9 以降で大きく異なる機能
構成の確実性
依存関係を宣言することにより、エラーを起こしやす
いクラスパスのメカニズムを置き換える
強力なカプセル化
public タイプに対するアクセスコントロールを実現
(内部向けパッケージへの外部からのアクセスを制限)
Module 宣言
public ≠ すべてアクセス可能
依存関係が解決された (= 必要なモジュールで
構成された) カスタム JRE をビルドすることが
できる
53
• 関連する JEP (JDK Enhancement Proposal)
– JEP 261: Module System
– JEP 200: The Modular JDK
– JEP 201: Modular Source Code
– JEP 220: Modular Run-Time Images
– Plus
• JEP 260: Encapsulate Most Internal APIs
• JEP 282: jlink: The Java Linker
JDK 9 では Module System の導入によって JDK の仕組みが大きく変更さ
れています。
それに伴い内部 API へのアクセスが使用不可になったり、Deprecated な
API の削除など後方s互換性に制限が出てきます。
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
jdk1.8.0 jdk-9
Java SE 9 からの変更点:
JDK ディレクトリ構成の変更 (JEP 220: Modular Run-Time
Images)
$JAVA_HOME
bin - 実行コマンド
lib
tools.jar
rt.jar
include
db
jre
src.zip
$JAVA_HOME
bin - 実行コマンド
conf - 設定ファイル
jmod - モジュール定義 (コンパイル済み)
lib - 内部実装 (直接参照や変更不可)
*.properties, *.policy など
(必要に応じて変更可能)
include
legal – モジュール単位のcopyright や license
src.zip
54
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java SE 9 からの変更点:
JDK/JRE: 廃止された機能
• tools.jar(JDK) と rt.jar(JRE)
• Extension メカニズム (JEP 261)
– java.ext.dirs システムプロパティがセットされていると起動エラー
– lib/ext ディレクトリが存在すると起動エラー
• Endorsed Standards Override メカニズム
– java.endorsed.dirs システムプロパティがセットされていると起動エラー
– lib/endorsed ディレクトリが存在すると起動エラー
• JRE バイナリは提供されなくなる (Java 11)
– jlink でビルドは可能
55
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java SE 9 からの変更点:
JEP 260: Encapsulate Most Internal APIs
• 内部 APIの大半はカプセル化され使用不可に
– 広く使われてしまっていた内部 API (Critical APIs) は代替が提供されるまでは
使用可能
• 内部実装の静的な利用の確認方法
– -jdkinternals オプションで jdeps を実行
• リフレクションを使用した内部実装の動的な利用の確認方法
– 実行時の java.lang.IllegalAccessException の情報を活用する
• カプセル化の解除用オプションでアクセス可能
– 実際に削除されているAPIもある
– : 内部実装APIの互換性は保障されない (通知なしに変更される可能性あり)
56
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Java SE 9 からの変更点:
JEP 277: Enhanced Deprecation
• @Deprecated 注釈に属性を追加可能に
– since: いつから非推奨になったか
– forRemoval: 将来のリリースで削除される予定か
@Deprecated(since=9, forRemoval=true)
57
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
参考: JDKに付属するツール
• 非推奨 API の確認
– ソースコード内の利用: javac の –deprecation オプション
– バイナリ内の静的な利用: jdeprscan コマンド
• 内部 API の利用の確認
– バイナリ内の静的: jdeps コマンドの -jdkinternals または --jdk-internals オプション
– バイナリ内の動的: java コマンドの --illegal-access=<warn or debug> オプション
• 必要なモジュールのみで構成するカスタムJREの生成
– jdeps で必要なモジュールの確認
– jlink で不要なモジュールの削除
• マルチ・リリース JAR ファイル
– jar コマンドの --release オプション
58
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
In the future …
• Project Amber
– JEP 325 Switch Expressions (Java 12)
– JEP 326 Raw String Literals (Java 12)
– JEP 286 Local-Variable Type Inference (var) (JDK 10 でリリース済み)
– JEP 323 Local-Variable Syntax for Lambda Parameters (JDK 11)
• Project Loom
– Fiber と Continuations を使った並列処理
• Project Panamas
– JVM と ネイティブコードの相互接続 (ベクター演算のサポート)
• Project Valhalla
– Value Type と Generic Specialization (プリミティブ型 参照型)
59
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
後編のまとめ
• スキルアップ。やっぱり必要です。
–Java SE 9 は実は重要なリリースです
• Module System の導入による機能変更の影響が大きいのでしっかり把握。
–JVM まわりの変更点は、開発者も運用担当者も押さえておく
• 非推奨になる API や内部 API はなるべく使用を避けましょう
–Java プログラミングの基礎知識がないと新機能や変更点の評価も難しい…
• リリースモデルの変更も押さえておきましょう
–現時点での Java SE 9 以降の現実的な移行先は Java SE 11 (JDK 11) です
• 利用する機能によっては JDK 8 + 有償サポートも選択肢に。
60
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Oracle University
教育サービスご紹介
研修コースと認定資格
61
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
アプリケーション・アーキテク
チャ設計の考え方を理解したい
データベースで SQL がどのように処理されるかを理解し
効果的な SQL チューニングの方法を理解したい
JVM の仕組みを
詳しく理解したい
アプリケーションサーバーのアーキテクチャや運用管理方法を理解したい
Java EE アプリケーションの
開発方法を理解したい
Java によるオブジェクト指向をしっかり理解したい
ラムダ式や Stream API を使った
プログラミングを理解したい
より実践的なスキルを
手を動かしながら定着させたい
Java EE システム開発のためのラーニングパス
- 正しく技術を理解するために -
Java SE 8
プログラミング I
(3日間)
Java SE 8
プログラミング II
(3日間)
Java EE 7
アプリケーション開発
(5日間)
Oracle WebLogic Server
12c: 管理 I (5日間)
Java EE
エンタープライズ・
アプリケーションの設計
(5日間)
Java SE 8 新機能
(2日間)
62
Java オブジェクト指向
プログラミング
(3日間)
Oracle Database 12c:
管理 ワークショップ
(5日間)
UNIX/Linux 入門
(3日間)
Webシステム構築
クイック・スタート
(3日間)
Oracle Database 12c: SQL
基礎 I
(3日間)
開発に必要になる技術要素を詳しく学習したい 高度な技術を詳しく学習したい
Java パフォーマンス・チュー
ニング
(3日間)
Oracle WebLogic Server
12c: トラブルシューティング
(2日間)
スキル強化
ワークショップ
- Java 実装編 -
スキル強化
ワークショップ
- Middleware 実装編 -
スキル強化
ワークショップ
- SQL チューニング編 -
Oracle Database 12c:
SQL チューニング
ワークショップ (3日間)
Web システムの全体感を
知りたい
OS の操作方法を覚えたい
データベースの基本と SQL の
書き方を覚えたい
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
おすすめ研修コース (1)
Java オブジェクト指向プログラミング
概要
このコースでは、Java によるオブジェクト指向プログラミングにフォーカスして説明します。クラスとインスタンス、カプセル化、
継承、ポリモフィズムなど、オブジェクト指向プログラミングに不可欠な知識から、デザインパーターンなどオブジェクト指向に
おける設計の考え方と UML の書き方を、演習を通して実践的に身につけることができます。
【注】このコースは、「Java SE 7/8 プログラミング I」コースをカスタマイズして実施します。
学習トピック
 Java 言語入門
 Java 言語の文法
 オブジェクト指向プログラミング 1
 オブジェクト指向の概念の理解
 クラスの定義とインスタンス化
 メソッド・コンストラクタの定義と
オーバーロード
 static 変数と static メソッド
 オブジェクト指向プログラミング 2
 継承
 メソッドのオーバーライド
 インタフェースの使用
 参照型の型変換
 例外処理
 java.lang パッケージ
 デザインパターンと UML
 Composite / Factory Method / Strategy /
Singleton / Adapter / Builder / Visitor /
Observer / Command / Façade
 UML の基本的な書き方 (ユースケース図,
クラス図, シーケンス図)
受講前提条件
• 「Java プログラミング for ビギナーズ」受講相当の知識
• 「Java SE 7/8 プログラミング I 」受講相当の知識 (推奨)
コース日数 3日間
63
※1 太字でハイライトした章に重点をおいて講義を行いま
す。
※2「デザインパターンと UML 」の章は、補足資料を使用
します。それ以外の章は「Java SE 7 プログラミング I」コー
スのテキストを使用します。
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 64
おすすめ研修コース (2)
Java SE 7 New Features
Java SE 8 までをじっくりキャッチアップ。
オラクルユニバーシティでは、Java SE 7 / 8 の新機能を効率的に学習することができる研修コースを提供し
ています。Java SE 7 / 8 で加わった新機能をわかりやすい講義と実機演習を通してをじっくり・しっかり身に
つけることができます。
コース
概要
このコースではJava SE 7の主な変更点と新機能の詳細を説明します。このコースはJava SE 6ある
いはそれ以前のバージョンのJava SEを使用した開発経験があるJava技術者が対象になります。
コースの受講者は、Java SE 7の変更点と新機能を深く理解し、Java SE 7を使用したアプリケー
ション開発を行えるようになります。
学習
内容
言語仕様に対する小さな変更(JSR 334)
動的言語呼び出しのサポート(JSR 292)
並行処理とコレクションにおける拡張(JSR 166Y)
ネットワークとファイルシステムアクセスに関する拡張
(JSR 203)
JDK 7におけるその他の拡張
日数
2日間
Java SE 8 新機能
コース
概要
このコースでは、Java SE 8の主要な変更点および機能拡張について詳しく学習します。新機能の
概要を理解するとともに、ラムダ式、コレクションを操作するためののStream API、日時操作のため
の新しい Data and Time APIの使用方法を学習することができます。
学習
内容
Java SE 8での変更点の概要
関数型インタフェースとラムダ式
java.util.funcation パッケージ
Stream API によるコレクション操作
並列 Stream
Date and Time APIの使用
Nashornを使用したJavaでのJavaScript処理
Mission Control および Flight Recorder の概要
日数
2日間
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
おすすめ研修コース (3)
Java パフォーマンス・チューニング
概要
このコースでは、Java SE 7で導入されたG1 GCをはじめとした様々なガベージコレクションの仕組みを理解するとともにJVM
の最適化手法について学習することができます。また、Java Flight RecorderおよびJava Mission Controlを使用したアプリケ
ーションのプロファイリングやモニタリングを方法を学習することができます。
学習項目
 パフォーマンス・チューニングの基本的なアプローチ
 世代別ガベージコレクションの仕組み
 G1 GCの仕組み
 アプリケーションおよびJVMレベルでのモニタリング
 Java Flight RecorderおよびMission Controlを使用したアプリケーショ
ンのプロファイリングとモニタリング
 オペレーティングシステム・レベルでのパフォーマンス監視
 ガベージコレクション方式の選択によるチューニング
 アプリケーションのチューニング
受講前提条件
• 「Java SE 7/8 プログラミング I 」の受講または受講相当の知識
• 「Java SE 7/8 プログラミング II 」の受講または受講相当の知識 (推奨)
コース日数 3日間
65
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
スキル強化ワークショップ
66
問題発生
なぜ
起こる?
どう
直す?
どう
防ぐ?コース
概要
このコースでは、適切なシステム化を行うために理解しておきたい実装、および設計のポ
イントについて学習します。単純な実装レベルの注意事項から設計時における注意事項
まで、開発現場で実際に起こりがちな事象を題材に、それを見逃すとどうなるか?解決す
るにはどうするかをワークショップ形式の演習と経験豊富な講師によるわかりやすい講
義を通して理解することができます。
ねらい
実際に起こりえる事象に対する対応方法をワークショップ形式で体験することで
• 事象の調査方法など現場対応能力を向上させる
• 設計や実装で陥りがちなミスを理解する
• 本来どのように設計・実装するべきかを理解する
設計・システム化能力の強化につながるエッセンスを
実例から学ぶことができます
設計・システム化能
力の強化
Java EE ベースのシステム開発を行うために押さえておきたい勘所を押さえる
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
スキル強化ワークショップ - Java実装編 -
67
コース
概要
このコースでは、アプリケーションの実装に関する考慮事項について学習します。テーマ別に、陥りがちな実装上
のミスとそれが引き起こす事象について理解すると共に、設計時・実装時においてどのように考慮することが望ま
しいかについて理解を深めます。講義はワークショップ形式で実施し、問題のあるアプリケーションの実装の確認
からプログラム修正による解決までを体験しながら学習することができます。
コース
内容
マルチスレッドに関する問題
誤った例外の扱い
リソース・リーク
文字列の操作とローカライズ
デザインパターン
コーディングのアンチパターン
日数 3日間
価格 担当営業までご相談ください
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
Javaプログラミングスキルを客観的に証明する世界共通の認定資格です。
Oracle 認定 Java 資格
設計者の意図を正しく理解して独力で
機能実装が行えるレベル
(中上級Javaプログラマ向け)
Gold資格は、コレクションAPI, ファイルI/O, 並行処理、JDBCなどのコア・ライブラリを使
用方法と Java SE 8 の新機能である Lambda 式や Stream API を使用した関数スタイ
ルのプログラミング方法を理解していることを証明します。
加えてデザインパターンについても問われるため設計から実装までの包括的なスキル
を身につけていることを証明します。
(Global資格: Oracle Certified Professional, Java SE 8 Programmer)
上級者の指導のもとで実装コードや
テストコードを書けるレベル
(初級Javaプログラマ向け)
Silver資格は、Java言語の基本文法とオブジェクト指向プログラミング(クラス、インタ
フェース、例外処理)を理解しているかどうかが主な出題項目です。また、基本的な
Lambda 式の書き方やDate and Time API の基礎を含めたプログラミングのために必要
とされる仕様を詳細に理解していることを証明します。
(Global資格: Oracle Certified Associate, Java SE 8 Programmer)
Javaによるオブジェクト指向
プログラミングを覚えたレベル
(言語を初めて学ぶプログラマ向け)
Bronze資格は、Java言語の基本文法(変数宣言や制御文)とクラスや
メソッドの定義などJavaプログラミングの基本を理解しているかどうか
が主な出題項目です。言語初学者が理解するべき基礎項目を理解し
ていることを証明します。
Oracle Certified
Java Programmer,
Gold SE 8
Oracle Certified
Java Programmer,
Silver SE 8
Oracle Certified
Java Programmer,
Bronze SE 7/8
「なんとなく書ける」から「理解し
て書ける」へ
標準に準拠した確かな実装スキルは、生
産性や保守性の向上に貢献することがで
きます。
Oracle 認定 Java 資格は、Java プログラ
ミングスキルを客観的に証明する
世界共通の認定資格です。
• Java SE プログラミング・スキルを
網羅的に証明
• Bronze, Silver, Goldとスキルを段
階別に認定
• 世界共通*の認定資格
= 技術者同士の共通プロトコル
* Silver/Gold 資格は Global 資格と同時認定されます。Bronze 資格は日本のみの資格です。
68
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
「実務で役立つ資格」
「キャリア形成に役立つ資格」
第 1 位
新バージョンの試験を
選択する受験者の割合
資格試験の年間受験者数
2013 年から 4 年間で約 2.5 倍に
Oracle 認定 Java 資格の価値
#1 【出典】IT技術資格に関する意識調査 - 株式会社アイ・ティ・アール (2016 年)
X2.5
92% Java SE 資格試験に占める Java SE 8 試験受験者の割合 (2017 年)
本資格試験は単に資格を取得して終わるようなものではなく、実務にも活用できる
非常に実践的な内容になっていると思います。
OCJP Gold 資格試験はデザインパターンの基礎もその試験範囲に入っているため
コーディングスタイルを初めとした開発標準を規定するアーキテクトといった指導的
な立場にある場合に、自分の力を客観的にはかる道具として取っておくことには大
きな メリットがあると思います。
単純に Java の文法を丸暗記しただけでは取得できないものとなっています。体当
たりで覚えざるをえなかった Java 文法などを体系的に学ぶことで平均的な Java プ
ログラマから頭一つ抜けた存在になれると思います。
【資格取得者の声】
69
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 70
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-

Más contenido relacionado

La actualidad más candente

GoldenGateテクニカルセミナー1「市場のトレンドと最新事例のご紹介」(2016/5/11)
GoldenGateテクニカルセミナー1「市場のトレンドと最新事例のご紹介」(2016/5/11)GoldenGateテクニカルセミナー1「市場のトレンドと最新事例のご紹介」(2016/5/11)
GoldenGateテクニカルセミナー1「市場のトレンドと最新事例のご紹介」(2016/5/11)オラクルエンジニア通信
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方Yuki Morishita
 
sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策scalaconfjp
 
Oracle GoldenGate for Big Data 12.2 セットアップガイド
Oracle GoldenGate for Big Data 12.2 セットアップガイドOracle GoldenGate for Big Data 12.2 セットアップガイド
Oracle GoldenGate for Big Data 12.2 セットアップガイドオラクルエンジニア通信
 
Nashorn in the future (Japanese)
Nashorn in the future (Japanese)Nashorn in the future (Japanese)
Nashorn in the future (Japanese)Logico
 
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!yoyamasaki
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介AdvancedTechNight
 
Apache Geode で始める Spring Data Gemfire
Apache Geode で始めるSpring Data GemfireApache Geode で始めるSpring Data Gemfire
Apache Geode で始める Spring Data GemfireAkihiro Kitada
 
States of Dolphin - MySQL最新技術情報2013秋 -
States of Dolphin - MySQL最新技術情報2013秋 -States of Dolphin - MySQL最新技術情報2013秋 -
States of Dolphin - MySQL最新技術情報2013秋 -yoyamasaki
 
Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Chihiro Ito
 
[A23] Oracle移行を簡単に。レプリケーションテクノロジーを使いこなす by Keishi Miyachi
[A23] Oracle移行を簡単に。レプリケーションテクノロジーを使いこなす by Keishi Miyachi[A23] Oracle移行を簡単に。レプリケーションテクノロジーを使いこなす by Keishi Miyachi
[A23] Oracle移行を簡単に。レプリケーションテクノロジーを使いこなす by Keishi MiyachiInsight Technology, Inc.
 
第九回中国地方DB勉強会 in 米子 MySQL 5.7+
第九回中国地方DB勉強会 in 米子 MySQL 5.7+第九回中国地方DB勉強会 in 米子 MySQL 5.7+
第九回中国地方DB勉強会 in 米子 MySQL 5.7+Ryusuke Kajiyama
 
Percona ServerをMySQL 5.6と5.7用に作るエンジニアリング(そしてMongoDBのヒント)
Percona ServerをMySQL 5.6と5.7用に作るエンジニアリング(そしてMongoDBのヒント)Percona ServerをMySQL 5.6と5.7用に作るエンジニアリング(そしてMongoDBのヒント)
Percona ServerをMySQL 5.6と5.7用に作るエンジニアリング(そしてMongoDBのヒント)Colin Charles
 
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)NTT DATA Technology & Innovation
 
[D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama
[D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama [D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama
[D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama Insight Technology, Inc.
 
Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...
Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...
Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...NTT DATA Technology & Innovation
 

La actualidad más candente (20)

GoldenGateテクニカルセミナー1「市場のトレンドと最新事例のご紹介」(2016/5/11)
GoldenGateテクニカルセミナー1「市場のトレンドと最新事例のご紹介」(2016/5/11)GoldenGateテクニカルセミナー1「市場のトレンドと最新事例のご紹介」(2016/5/11)
GoldenGateテクニカルセミナー1「市場のトレンドと最新事例のご紹介」(2016/5/11)
 
Oracle GoldenGate FAQ
Oracle GoldenGate FAQOracle GoldenGate FAQ
Oracle GoldenGate FAQ
 
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
 
sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策
 
Oracle GoldenGate導入Tips
Oracle GoldenGate導入TipsOracle GoldenGate導入Tips
Oracle GoldenGate導入Tips
 
Oracle GoldenGate for Big Data 12.2 セットアップガイド
Oracle GoldenGate for Big Data 12.2 セットアップガイドOracle GoldenGate for Big Data 12.2 セットアップガイド
Oracle GoldenGate for Big Data 12.2 セットアップガイド
 
Nashorn in the future (Japanese)
Nashorn in the future (Japanese)Nashorn in the future (Japanese)
Nashorn in the future (Japanese)
 
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 
Apache Geode で始める Spring Data Gemfire
Apache Geode で始めるSpring Data GemfireApache Geode で始めるSpring Data Gemfire
Apache Geode で始める Spring Data Gemfire
 
States of Dolphin - MySQL最新技術情報2013秋 -
States of Dolphin - MySQL最新技術情報2013秋 -States of Dolphin - MySQL最新技術情報2013秋 -
States of Dolphin - MySQL最新技術情報2013秋 -
 
Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要
 
Vespa 機能紹介 #yjmu
Vespa 機能紹介 #yjmuVespa 機能紹介 #yjmu
Vespa 機能紹介 #yjmu
 
[A23] Oracle移行を簡単に。レプリケーションテクノロジーを使いこなす by Keishi Miyachi
[A23] Oracle移行を簡単に。レプリケーションテクノロジーを使いこなす by Keishi Miyachi[A23] Oracle移行を簡単に。レプリケーションテクノロジーを使いこなす by Keishi Miyachi
[A23] Oracle移行を簡単に。レプリケーションテクノロジーを使いこなす by Keishi Miyachi
 
第九回中国地方DB勉強会 in 米子 MySQL 5.7+
第九回中国地方DB勉強会 in 米子 MySQL 5.7+第九回中国地方DB勉強会 in 米子 MySQL 5.7+
第九回中国地方DB勉強会 in 米子 MySQL 5.7+
 
Percona ServerをMySQL 5.6と5.7用に作るエンジニアリング(そしてMongoDBのヒント)
Percona ServerをMySQL 5.6と5.7用に作るエンジニアリング(そしてMongoDBのヒント)Percona ServerをMySQL 5.6と5.7用に作るエンジニアリング(そしてMongoDBのヒント)
Percona ServerをMySQL 5.6と5.7用に作るエンジニアリング(そしてMongoDBのヒント)
 
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
 
[D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama
[D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama [D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama
[D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama
 
Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...
Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...
Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...
 

Similar a Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-

今年はJava進化の年!今知っておくべき新しいJava
今年はJava進化の年!今知っておくべき新しいJava今年はJava進化の年!今知っておくべき新しいJava
今年はJava進化の年!今知っておくべき新しいJavaTakashi Ito
 
コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!オラクルエンジニア通信
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッションYuichi Hasegawa
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題Kota Mizushima
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発Kota Mizushima
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?Takahiro YAMADA
 
JavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaJavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaなおき きしだ
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.jsTanUkkii
 
Beginning Java EE 6 勉強会(1) #bje_study
Beginning Java EE 6 勉強会(1) #bje_studyBeginning Java EE 6 勉強会(1) #bje_study
Beginning Java EE 6 勉強会(1) #bje_studyToshiaki Maki
 
Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2shozon
 
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)オラクルエンジニア通信
 
20161119 java one-feedback_osaka
20161119 java one-feedback_osaka20161119 java one-feedback_osaka
20161119 java one-feedback_osakaTakashi Ito
 
Open stack reference architecture v1 2
Open stack reference architecture v1 2Open stack reference architecture v1 2
Open stack reference architecture v1 2Dell TechCenter Japan
 
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)torutk
 
Oracle Database / Exadata Cloud 技術情報(Oracle Cloudウェビナーシリーズ: 2020年7月9日)
Oracle Database / Exadata Cloud 技術情報(Oracle Cloudウェビナーシリーズ: 2020年7月9日)Oracle Database / Exadata Cloud 技術情報(Oracle Cloudウェビナーシリーズ: 2020年7月9日)
Oracle Database / Exadata Cloud 技術情報(Oracle Cloudウェビナーシリーズ: 2020年7月9日)オラクルエンジニア通信
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門Daiyu Hatakeyama
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5Takahiro YAMADA
 
What is java_se_7
What is java_se_7What is java_se_7
What is java_se_7TakumiIINO
 

Similar a Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ- (20)

今年はJava進化の年!今知っておくべき新しいJava
今年はJava進化の年!今知っておくべき新しいJava今年はJava進化の年!今知っておくべき新しいJava
今年はJava進化の年!今知っておくべき新しいJava
 
コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッション
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題
 
Java in the World of Container by David Buck
Java in the World of Container by David BuckJava in the World of Container by David Buck
Java in the World of Container by David Buck
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
 
JavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaJavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJava
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
Beginning Java EE 6 勉強会(1) #bje_study
Beginning Java EE 6 勉強会(1) #bje_studyBeginning Java EE 6 勉強会(1) #bje_study
Beginning Java EE 6 勉強会(1) #bje_study
 
Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2
 
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
 
20161119 java one-feedback_osaka
20161119 java one-feedback_osaka20161119 java one-feedback_osaka
20161119 java one-feedback_osaka
 
Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)
 
Open stack reference architecture v1 2
Open stack reference architecture v1 2Open stack reference architecture v1 2
Open stack reference architecture v1 2
 
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)
 
Oracle Database / Exadata Cloud 技術情報(Oracle Cloudウェビナーシリーズ: 2020年7月9日)
Oracle Database / Exadata Cloud 技術情報(Oracle Cloudウェビナーシリーズ: 2020年7月9日)Oracle Database / Exadata Cloud 技術情報(Oracle Cloudウェビナーシリーズ: 2020年7月9日)
Oracle Database / Exadata Cloud 技術情報(Oracle Cloudウェビナーシリーズ: 2020年7月9日)
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
 
What is java_se_7
What is java_se_7What is java_se_7
What is java_se_7
 

Último

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 

Último (8)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 

Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-

  • 1. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java ヂカラ 日本オラクル株式会社 オラクルユニバーシティ ビジネス推進部 岡田 大輔 2018 年 11 月 16 日 Java プログラミングのこれまでとこれから。
  • 2. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、 情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。 以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するもの ではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関 して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決 定されます。 Oracle と Java は、Oracle Corporationおよびその子会社、関連会社の米国おそびその他の国における登録商標です。 文中の社名、商品名等は各社の商標または登録商標である場合があります。 2
  • 3. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Duke, the Java Mascot Manifest the Future (FY15) Cloud Master (FY16) Future Builder (FY17) Java 9 Builder (FY18) Classic Duke Duke のデザイン Duke はオープンソース (BSD ライセンス) なのでBSDラインセンス下であれば 自由にデザインを改変可能ですが、オラクルでは、通年で使用可能な Classic Duke と毎年異なるデザインの Annual Duke のみを使用しています。(単なる 社内ルールなのですが…。) 新デザインは毎年秋頃に米国サンフランシスコ で開催される Oracle Code One で発表されます。 3 Java Duke Racer (FY19)
  • 4. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 本日お話したいこと はじめに: Java プログラミングのこれまでとこれから つぎに: Java プログラミングのこれまでとこれから 最後に: Oracle University 教育サービスご紹介 1 2 3 4
  • 5. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java プログラミング。 ちゃんとできますか? Java プログラミングのこれまでとこれから。 前編 5
  • 6. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 質問。 現在お使いの Java のバージョンはどれですか? では、現在無償で利用可能な Java のバージョンは? 6 • Java は Oracle JDK または OpenJDK 環境を指します。 • 無償で利用可能 = Public Update が提供されていることとします。 セキュリティパッチの適用なしで運用したりしませんよね?
  • 7. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 7 Java SE のあゆみ • 1996 • Java 誕生 • 1998 • Collections • 2002 • JCP • 2006 • JVMTI • 2014 • Lambda • 1997 • JDBC • 2000 • HotSpot • 2004 • Generics • 2011 • Oracle 買収 • 2017/9/21 • Module System 1.0 1.2 1.1 1.3 1.4 5.0 6 7 8 9 無償サポート終了 無償サポート終了 現行バージョン 無償サポート終了 • 2018/3/20 • var (Local Variable Type Interface) 10 無償サポート終了 • 2018/9/25 • LTS Release 11 現行バージョン
  • 8. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | おさらい: Java SE 8 までの主な新機能 • Java SE 5 (2004.5 ) – BigDecimal クラスによる浮動小数点演算の強化 – 総称型 (Generics) の追加によるコンパイラによる型安全性の向上 – 注釈 (Annotation) によるメタデータ機能の追加 – 列挙型 (enum)、オートボクシング・アンボクシング、拡張 for 文、静的イン ポート、可変長引数による拡張 – Unicode 4.0 および補助文字サポート – JAR ファイルの高圧縮形式(Pack200)サポート • Java SE 7 (2011.7) – Project Coin (JSR 334) – InvokeDynamic (JSR 292) – NIO.2 (JSR 203) – JDBC 4.1 – Fork-Join フレームワーク (JSR 166y) – JAXP, JAXB, JAX-WSの更新 – JavaFX 2.0 – ClassLoader の改善 – G1GC の導入 • Java SE 6 (2006.12) – AWT、Swingの高速化 – JDBC 4.0 – JAXP (Java API for XML Processing) 1.4 – Executors フレームワーク (JSR166) – Webサービス – Windows システムトレイの サポート – Windows Aero のルック・ アンド・フィール – テキストのUnicode正規 (java.text.Normalizer) • Java SE 8 (2014.3) – Project Lambda • ラムダ式 (JSR 335) • Stream API – Type Annotation (JSR 308) – Date and Time API (JSR 310) – 高速 JavaScript エンジン (Nashorn) – JavaFX 8 – Hotspot と JRockitの統合 8 ラムダ式は言語仕様の変更を伴う 重要な新機能
  • 9. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java SE 9 の主要な新機能と機能変更 BehindthescenesNewfunctionality SpecializedNewstandards HousekeepingGone • Store Interned Strings in CDS Archives • Improve Contended Locking • Compact Strings • Improve Secure Application Performance • Leverage CPU Instructions for GHASH and RSA • Tiered Attribution for javac • Javadoc Search • Marlin Graphics Renderer • HiDPI Graphics on Windows and Linux • Enable GTK 3 on Linux • Update JavaFX/Media to Newer Version of GStreamer • Jigsaw –Modularize JDK • Enhanced Deprecation • Stack-Walking API • Convenience Factory Methods for Collections • Platform Logging API and Service • jshell: The Java Shell (Read-Eval-Print Loop) • Compile for Older Platform Versions • Multi-Release JAR Files • Platform-Specific Desktop Features • TIFF Image I/O • Multi-Resolution Images • Process API Updates • Variable Handles • Spin-Wait Hints • Dynamic Linking of Language-Defined Object Models • Enhanced Method Handles • More Concurrency Updates • Compiler Control • HTTP 2 Client • Unicode 8.0 • UTF-8 Property Files • Implement Selected ECMAScript 6 Features in Nashorn • Datagram Transport Layer Security (DTLS) • OCSP Stapling for TLS • TLS Application-Layer Protocol Negotiation Extension • SHA-3 Hash Algorithms • DRBG-Based SecureRandom Implementations • Create PKCS12 Keystores by Default • Merge Selected Xerces 2.11.0 Updates into JAXP • XML Catalogs • HarfBuzz Font-Layout Engine • HTML5 Javadoc • Parser API for Nashorn • Prepare JavaFX UI Controls & CSS APIs for Modularization • Modular Java Application Packaging • New Version-String Scheme • Reserved Stack Areas for Critical Sections • Segmented Code Cache • Ahead-of-Time Compilation • Indify String Concatenation • Unified JVM Logging • Unified GC Logging • Make G1 the Default Garbage Collector • Use CLDR Locale Data by Default • Validate JVM Command-Line Flag Arguments • Java-Level JVM Compiler Interface • Disable SHA-1 Certificates • Simplified Doclet API • Deprecate the Applet API • Process Import Statements Correctly • Annotations Pipeline 2.0 • Elide Deprecation Warnings on Import Statements • Milling Project Coin • Filter Incoming Serialization Data • Remove GC Combinations Deprecated in JDK 8 • Remove Launch-Time JRE Version Selection • Remove the JVM TI hprof Agent • Remove the jhat Tool JDK 9 で デフォルトになった 機能 新しく追加 された機能/ ツール群 新しい 技術標準への 対応 変更を必要と する高度な 新機能 ライブラリの 改善や内部的な 実装変更など JDK 9 で 削除されたもの 9
  • 10. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java SE 10 (18.3) の主要な新機能と変更点 • JEP 286: Local-Variable Type Interface – ローカル変数の型推論 10 var list = new ArrayList<String>(); // infers ArrayList<String> var stream = list.stream(); // infers Stream<String> var は、予約語ではなく型名 (var というクラス) • var var = 1; は可能 • 既存クラスに var クラスが存在する場合は要注意 (Java の命名規則などを考えると var クラスは存在しないと思いたい…) • JEP 307: Parallel Full GC for G1 G1 GC のフルGC を並列化 • JEP 313 Remove Native-Header Generator Tool javah の削除 (javac で代替可能) • JEP 314: Additional Unicode Language Extensions java.util.Locale 他で BCP47 言語タグの Unicode 拡張を実装 • JEP 322: Time-Based Release Versioning 時間ベースのリリースに対応したバージョン記述 $FEATURE.$INTERIM.$UPDATE.$PATCH (6 ヶ月ごとのリリースで $FEATURE が増え、メンテナンスリリースで $UPDATE が 増える。$INTERIM は原則として 0) • JEP 296: Consolidate the JDK Forest into Single Repository OpenJDK のリポジトリを統合 • JEP 301: Application Data-Class Sharing クラスデータ共有(CDS) をアプリケーションクラスでも使用可能に • JEP 312: Thread-Local Handshakes VM 全体のセーフポイントを使用せずに個々のスレッドでコールバックを 実行する方法を提供 • JEP 204: Garbage Collector Interface JVM から GC を独立させるためのインタフェース • JEP 316: Heap Allocation on Alternative Memory Device NV-DIMM などの代替メモリー・デバイスに Java オブジェクト・ヒープを割当て可能に
  • 11. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java SE 11 (18.9) の主要な新機能と変更点 • JEP 323: Local-Variable Syntax for Lambda Parameters – ローカル変数の型推論がラムダ式でも使用可能に 11 list.stream().map((var s) -> s.toLowerCase()) .collect(Collectors.toList()); • JEP 330: Launch Single-File Source-Code Programs > java HelloWorld.java が可能に! • JEP 321: HTTP Client (Standard) Java SE 9 で Incubator Module だったものが標準化 • JEP 327: Unicode 10 Unicode 10 をサポート。 … ということは、.properties ファイルで絵文字を使用可に! • JEP 320: Remove The Java EE and CORBA Modules Java SE に同梱されていた JAX-WS, JAXB, CORBA 関連のモジュールを削除 • JEP 335: Deprecate the Nashorn Scripting Engine Java SE 8 で導入された Nashorn は今後削除される。 今後は GraalVM の使用を推奨。 • JEP 318: The Epsilon Garbage Collector “no-op” ガベージコレクタ。メモリ回収を行わない。 Experimental なので使用できるシーンは限られる • JEP 333: ZGC A Scalable, Low Latency Garbage Collector Pauseless GC。大規模メモリ環境で低レイテンシが求められる場合に有効だがこ れも Experimental。利用の際は要事前検証。 • JEP 332: Transport Layer Security (TLS) 1.3 TLS 1.3 をサポート • JEP 328: Flight Recorder Oracle JDK の商用機能だった超高性能プロファイラがオープンソース化。 この機能が役に立つのはこういう場合 (ラムダ式で var を使った引数に注釈 (Type Annotation)を追加できる) list.stream() .map((@Notnull var s) -> s.toLowerCase()) .collect(Collectors.toList());c
  • 12. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 今ドキの Java でかけますか? ところで。 Java 書けてますか? 12
  • 13. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | • よくあるコード • 状況 – Item クラスをカプセル化してアクセサメソッド (setter/getter)を実装。 • 何が問題? – インスタンス変数の値をアクセサメソッドを介し てかんたんに取得できると、振るまいはインス タンス変数とは別の場所に実装されてしまう • 責務の分割が不十分に • 結果としてコードの重複などが発生しやすい 13 ウォーミングアップ: オブジェクト指向プログラミング こんなコード書いていませんか? - その 1 1. public class Main { 2. public void method(Item item) { 3. int value = item.getAmount(); 4. item.setAmount(value + 1); 5. } 6. } 7. public class Item { 8. private int amount; 9. public void setAmount(int amount) { 10. this.amount = amount; 11. } 12. public int getAmount() { 13. return amount; 14. } 15. } Itemクラスとは別の場所に 振るまいが実装されている
  • 14. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | • こう書く。 • どう書く? – 別のクラスで実装していた振るまいを Item クラスの振るまいとして実装する (単一責任の原則) 14 ウォーミングアップ: オブジェクト指向プログラミング クラスの責務を考えた実装とは? 1. public class Main { 2. public void method(Item item) { 3. item.addAmount(1); 4. } 5. } 6. public class Item { 7. private int amount; 8. public void addAmount(int value) { 9. amount = amount + 1; 10. } 11. } Tips: 基本ルールは「求めるな。命じよ。」 インスタンス変数に対する単純なアクセサメソッドの公開は本 当に必要なのか?を確認
  • 15. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 今までの経験があれば対処できる? • Java でサマータイムを扱うには? – Date and Time API (Java SE 8 〜) • java.time.ZonedDateTime … タイムゾーン付で日付と時刻を扱うクラス 実務経験だけでは対処が難しいことも 1. LocalDateTime localDateTime = LocalDateTime.parse("2018-11-04T01:59:59"); 2. ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("America/New_York")); 3. System.out.println(localDateTime + "->" + zonedDateTime); 4. System.out.println(localDateTime.plusSeconds(2L) + "->" + zonedDateTime.plusSeconds(2L)); [出力結果] 2018-11-04T01:59:59->2018-11-04T01:59:59-04:00[America/New_York] 2018-11-04T02:00:01->2018-11-04T01:00:01-05:00[America/New_York] [注]: java.time.ZonedDateTime は JDK 付属の tz database を参照するため、IANA 管理の tz database 情報の 反映にタイムラグがある (更新には JDK の更新 or Time Zone Updater Tool を使用)。 また、他の実装系との整合性を取るために java.time.OffsetDateTime を使うケースもあり。この場合は夏時間 の適用ルール (ZonedRules) を実装した java.time.TemporalAjduster を用意する必要がある。
  • 16. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 1. public class JDTAdjuster implements TemporalAdjuster { 2. // 定数宣言 3. 4. @Override 5. public Temporal adjustInto(Temporal temporal) { 6. if (!(temporal instanceof OffsetDateTime)) { 7. throw new IllegalArgumentException(temporal 8. + "is not an instance of java.time.OffsetDateTime"); 9. } 10. OffsetDateTime offset = (OffsetDateTime) temporal; 11. if ((offset.getYear() >= JDT_START_YEAR) && isInSummerTime(offset)) 12. return offset.withOffsetSameInstant(ZoneOffset.ofHours(DST_OFFSET)); 13. return offset.withOffsetSameInstant(ZoneOffset.ofHours(REGULAR_OFFSET)); 14. } 15. 16. private boolean isInSummerTime(OffsetDateTime offsetDateTime) { 17. // Daylight Saving Time の判定 18. } 19. } 16 TemporalAdjuster を使って夏時間適用ルールを自前で実装する 今ドキの Java ならこんな書き方: サマータイムを扱うには? この TempralAdjuster を使用するには次のように書く TemporalAdjuster jdtAdjuster = new JDTAdjuster(); OffsetDateTime offsetDateTime = OffsetDateTime.parse("2020-05-10T02:00:01+09:00"); System.out.println(offsetDateTime + " -> " + offsetDateTime2.with(jdtAdjuster));
  • 17. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 1. private List fileToList(String fileName) throws Exception { 2. String line; 3. List lines = new ArrayList(); 4. BufferedReader reader = null; 5. try { 6. reader = new BufferedReader(new FileReader(fileName)); 7. while((line = reader.readLine()) != null) { 8. lines.add(line); 9. } 10. reader.close(); 11. } catch(Exception e) { 12. throw new CustomException(); 13. } 14. return lines; 15. } 17 「ファイルの全行を読み込む」: J2SE 1.4 相当の知識で何となく書くと… 今ドキな書き方はバージョンによっても変わる: こんなコード書いていませんか? どのチェック例外が発生するかわからない … カスタム例外だけをスローするとエラーの原因がわからない ( → エラーの原因が隠蔽されると保守性が低下する) 総称型を使っていない (→ 型安全でない) 例外が発生すると reader は close されずリークの遠因に
  • 18. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 1. private List<String> fileToList(String fileName) throws CustomSystemException { 2. List<String> lines = new ArrayList<String>(); 3. BufferedReader reader = null; 4. try { 5. reader = new BufferedReader(new FileReader(fileName)); 6. String line = null; 7. while(reader.readLine() != null) { 8. lines.add(line); 9. } 10. } catch (FileNotFoundException e) { 11. throw new CustomSystemException(FILE_NOT_FOUND, e); 12. } catch(IOException e) { 13. throw new CustomSystemException(FILE_READ_ERROR, e); 14. } finally { 15. try { 16. if (reader != null) reader.close(); 17. } catch(IOException e) { 18. System.out.println("ERROR at closing Reader: " + e.getMessage()); 19. } 20. } 21. return lines; 22. } 18 今ドキな書き方はバージョンによっても変わる: 当時は「正しい」とされた書き方 発生するチェック例外を明示 総称型を使う try-catch では finally 句でのリソースクローズ処理が必須 (→ 実装時にテスト必須) カスタム例外に翻訳する場合は、発生源の例外情報も含める 「ファイルの全行を読み込む」: Java SE 6 相当の知識で書くと…
  • 19. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 今ドキな書き方はバージョンによっても変わる: 新しい機能を適切に使う 「ファイルの全行を読み込む」: Java SE 7 ではスッキリ書ける 1. private List<String> fileToList(String fileName) throws CustomException { 2. List<String> lines = new ArrayList<>(); 3. try(BufferedReader reader = new BufferedReader(new FileReader(filename))) { 4. String line; 5. while((line = reader.readLine()) != null) { 6. lines.add(line); 7. } 8. } catch(FileNotFoundException e) { 9. throw new CustomException(FILE_NOT_FOUND, e); 10. } catch(IOException e) { 11. throw new CustomException(FILE_READ_ERROR,e); 12. } 13. return lines; 14. } 総称型 + ダイヤモンド演算子を使用 (型安全性) try-with-resources でリソースは自動クローズ ( → リソースのクローズは API レベルで担保) 19 バージョン毎に適した Java プログラミングを正しく行うことで 見通しのよい、保守性の高いコード を書くことができる = 実装・テスト工数を削減 することができる
  • 20. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | try-with-resources のコード例 • JSR 334: Project Coin 1. Switch 文での String の使用 2. Multi-catch 3. try-with-resrouces 文 4. ダイヤモンド演算子 5. アンダースコア付きリテラルとバイナリリテラ ル 20 おさらい: Java SE 7 の新機能 class MyResource implements java.lang.AutoCloseable { @Override public void close() throws Exception { // ... } } try (MyRecourse r1 = new MyResrouce(); MyResource r2 = new MyResoruce() ) { // ... } catch(MyException1 | MyException2 e) { e.printStackTrace(); } Reader/Writer などの File I/O 関連 API や JDBC API (Java SE 7 以上)、 および Stream API (Java SE 8) は AutoCloseable 対応 複数のリソースをオープンする場合は、 セミコロンで区切る (クローズはオープンと逆順) catch 句の処理内容が同じ場合はまとめて 記述することができる (Multi-catch)
  • 21. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 今ドキな書き方はバージョンによっても変わる: バージョンごとに適切な API を使う 「ファイルの全行を読み込む」: Java SE 7 NIO.2 を利用する 1. private List<String> readFile(String filename) { 2. try { 3. return Files.readAllLines(Paths.get(filename), Charset.defaultCharset()); 4. } catch (IOException e) { 5. throw new SytemException(FILE_READ_ERROR, e); 6. } 7. } 21 Java SE 7 の NIO.2 ではファイルのすべての行を読み込むためのメソッドが API として提供されている = さらに実装・テスト工数を削減可能 • メソッド呼び出しのみでファイル読み込み処理を実装できてテストは原則として不要 • 万が一実装に問題がある場合もパッチ適用で改善可能
  • 22. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | おさらい: Java SE 8 の新機能 関数型プログラミング in Java • 関数型プログラミング (Functional Programming) is … • 関数 is … • 関数型プログラミングと Java : – Java SE 8 からは 関数型プログラミングの要素が取り入れられた • コア API (コレクション・フレームワークなど) に関数型プログラミングをサポートするメソッドが追加 された (Collection::removeIf や List::replaceAll など) • 関数スタイルでデータ処理を行うための API が追加された (Stream API) 22 関数を使って (つなぎ合わせて) プログラミングすること 入力に対して一意の出力を持つ処理 関数の評価が他に影響を及ぼさない
  • 23. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | • これは関数 • これは関数 … ではない 23 関数 is 何? - コードで確認 1. public class Calc { 2. private int x; // メソッドの影響を受けない 3. public int multiply(int a, int b) { 4. return a * b; 5. } 6. } 1. public class Calc { 2. private int x; 3. public int multiply(int y) { 4. return x *= y; // 変数に影響する 5. } 6. } ⭕ 入力に対して一意の出力を返す ⭕ 関数の評価が他に影響を及ぼさない ⭕ 入力に対して一意の出力を返さない ⭕ 関数の評価が他に影響を及ぼす 関数を使うほうがコードの安全性を保ちやすくテストもしやすい 互いが依存しないので並列プログラミングにも向いている
  • 24. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 関数のもう一つの特性 • 関数を引数として扱うことができる (高階関数) – 関数を引数で渡すときの書き方がラムダ式 – 関数を引数で渡す? • Java はオブジェクト指向プログラミング言語なので関数 (メソッド) をそのまま渡せない • 関数をあらわすオブジェクト作った = 関数型インタフェース – 関数の入力と出力をインタフェースメソッドとして記述する – Java SE 8 のコア API として汎用関数型インタフェース (java.util.function パッケージ) を提供 24 list.stream().filter(data -> data.contains("c")).forEach(System.out::print); メソッド引数として「関数」を渡している
  • 25. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 関数型インタフェース • 単一の abstract メソッドを持つインタフェース (SAM インタフェース) – static メソッドやデフォルトメソッド、private メソッドは定義可能 – java.lang.Object クラスの public メソッドも定義可能 25 One Point: Java SE 8 と Java SE 9の新機能 (インタフェース関連) • static メソッド (SE 8 〜) • static キーワードを使用して宣言された メソッド • オーバーライド不可 (継承されない) • メソッド呼び出し方法: InterfaceType.method(); • デフォルトメソッド (SE 8 〜) • default キーワードを使用して宣言された メソッド • デフォルトメソッドの解決ルール: • スーパークラス > インタフェース • サブタイプ > スーパータイプ • 競合した場合は、実装クラスでオーバーライド • private メソッド (SE 9 〜) • default メソッドから呼び出し可能な実装メソッ ド • 実装クラスからは呼び出せない
  • 26. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 関数型インタフェース • これは関数型インタフェース? 26 1. @FunctionalInterface 2. public interface MyFunction { 3. private void hello() { 4. System.out.println("Hello Static!!"); 5. }; 6. int calc(int a, int b); 7. String toString(); 8. } private メソッド (Java SE 9 〜) これは 関数型インタフェース Object クラスの public メソッド
  • 27. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | ラムダ式 • 関数型インタフェースを実装するクラスのインスタンス化を簡略化するた めの構文 – 関数型インタフェースのメソッドにフォーカスして実装を記述できる 27 (x, y) -> x + y x + y を返す (メソッド本体) x と y を引数にとって (引数リスト)  メソッド名はどうやって決まる? → 関数型インタフェースは、SAM インタフェースなので実装するメソッドの名前や引数 の型、戻り値はひとつだけ。だから推論可能。  変数 x と変数 y はどこで宣言している? → ラムダ式中の x や y は引数名をあらわす。(任意の変数名をつけて OK)
  • 28. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | • ソート処理の実装で考えてみる (java.util.Comparator = 関数型インタフェース) – 無名クラスでインスタンス化 – ラムダ式だとこうなる 1. Arrays.sort(array, (String a, String b) -> { return a.compareToIgnoreCase(b); } ); 1. Arrays.sort(array, new Comparator<>() { 2. @Override 3. public int compare(String a, String b) { 4. return a.compareToIgnoreCase(b); 5. } } ); ラムダ式は何を簡略化している? 28 注意: 無名クラスを使った実装とラムダ式を使った実装は厳密には同じではありません。ラムダ式になれるための中間思考としてとらえてください。 クラス 変数 メソッド メソッド 無名クラスのイメージ ラムダ式のイメージ Java SE 9: 無名クラスでも ダイヤモンド演算子を使える
  • 29. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | • 無名クラス – コンパイルするとクラスファイルが生成 される (X$1.class) • ラムダ式 – コンパイルしてもクラスファイルが生成 されない – ラムダ式をあらわすコードは動的に生 成される (InvokeDynamic) 29 閑話休題: バイトコード (CAFEBABE) の世界 public static void main(java.lang.String...); Code: 0: iconst_4 // (省略) 26: invokedynamic #7, 0 // InvokeDynamic #0:compare:()Ljava/util/Comparator; 31: invokestatic #8 // Method java/util/Arrays.sort:([Ljava/lang/Object;Ljava/util/Comparator;)V 34: return private static int lambda$main$0(java.lang.String, java.lang.String); Code: 0: aload_0 1: aload_1 2: invokevirtual #9 // Method java/lang/String.compareToIgnoreCase:(Ljava/lang/String;)I 5: ireturn ラムダ式のバイトコード ラムダ式は、コンパイル対象のクラスのメソッドとしてコンパ イルされる • this はコンパイル対象のクラスを指す • クラスは実行時に invokedynamic によってオンメモリで生成される
  • 30. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Stream API とは? • データをパイプライン形式で処理するための API (Java SE 8 〜) – ストリームに対して関数操作を行った結果をストリームで返す (中間操作) – 処理結果をデータとして返す (終端操作) • 中間操作も終端操作もメソッド引数は関数型インタフェースを取るものが多い 30 Stream の生成 中間操作 終端操作 Stream.of() Arrays.stream(T) Collection.stream() … ※ 中間操作は遅延評価 forEach() reduce() collect() max(),min(),average() count(),sum() … filter() map() flatMap() peek() …
  • 31. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 今ドキな書き方はバージョンによっても変わる: バージョンごとに適切な API を使う 「ファイルの全行を読み込む」: Java SE 8 NIO.2 は Stream を返せる 1. private Stream<String> readFile(String filename) { 2. try { 3. return Files.lines(Paths.get(filename), Charset.defaultCharset()); 4. } catch (IOException e) { 5. throw new SytemException(FILE_READ_ERROR, e); 6. } 7. } 31
  • 32. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 今ドキな書き方はバージョンによっても変わる: バージョンごとに適切な API を使う Stream API でファイルに含まれる単語を抽出してみる 1. Stream<String> content = readFile("path_to_file"); 2. var words = content.flatMap(line -> Stream.of(line.split(“ ”))) // スペースを区切り文字にして要素をストリームに .filter(word -> word.length() > 3) // 長さが 3 より大きい単語を抽出 .map(String::toLowerCase) // ストリームの要素を小文字に .distinct() // 重複除外 .sorted((x, y) -> x.length() - y.length()) // 文字数が短い順にソート .collect(Collectors.toList()); // 各要素を List に格納して返す 32 Java SE 10: ローカル変数の 型名は推論可能
  • 33. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | まとめ: 関数型プログラミング in Java • Java SE 8 で関数を扱うために関数型インタフェースを提供している – 目的は安全なコードを早く、効率的に記述したい • オブジェクト指向プログラミングだけで用が足りるならそれで OK でも昨今の開発事情を考えるとたぶんそれは厳しい – テストを効率化したい! – 並列処理を効率化したい! – より安全にシンプルなコードを書きたい! – 関数型インタフェースをインスタンス化するためにラムダ式を使える • Collection や Stream API では関数オブジェクトを引数に取る処理が追加された – 使わなくても同じようなコードを書けるけど煩雑 – 関数型プログラミングを考え方を理解していないと API を活用できない • Java プログラミングの基礎知識は必須。コードも読めないし書けない 33
  • 34. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 前編のまとめ • スキルアップ。必要です。 –Java は時代とともに必要な機能を取り入れて進化し続けています –あたらしい機能は、あたらしいバージョンで提供されます • 言語仕様の変更や追加をともなう変更点はとくに。 –知識が古いままだと新機能の利点を享受できない場合も 34
  • 35. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java SE のリリースサイクル Java プログラミングのこれまでとこれから。 後編 35
  • 36. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 36 Java SE のあゆみ (再掲) • 1996 • Java 誕生 • 1998 • Collections • 2002 • JCP • 2006 • JVMTI • 2014 • Lambda • 1997 • JDBC • 2000 • HotSpot • 2004 • Generics • 2011 • Oracle 買収 • 2017/9/21 • Module System 1.0 1.2 1.1 1.3 1.4 5.0 6 7 8 9 無償サポート終了 無償サポート終了 現行バージョン 無償サポート終了 • 2018/3/20 • var (Local Variable Type Interface) 10 無償サポート終了 • 2018/9/25 • LTS Release 11 現行バージョン
  • 37. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 37 Java って 有償化したの?
  • 38. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 38 Java Is Still Free 参考: Java Is Still Free / 日本語訳: Java は今も無償です • 有償化したの? – 今まで通り最新版の無償更新は入手可能です – 今まで通り無償期間に取得したものはそのまま継続して利用可能です – 今まで通り年4回の更新版 (1, 4, 7, 10 月)を適用できます • Java アプレットは2019年1月(有償版は3月)で終了? – Java Plugin の定期更新は終了します • そもそも、主要ブラウザベンダーは年内でサポート終了の可能性が…
  • 39. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 課題 1. 大規模な機能の完成まで度々延期されるリリース 2. リリースされず蓄積している完成した中小の機能 3. 制限のある無償版の再配布 リリースに対する要望 1. 完成した機能は計画的に素早くリリース 2. シンプルかつ再配布可能な無償版のライセンス体系 39 リリースモデルの変更に至る背景: JDK 9 までの課題と今後のリリースへの要望 24 55 91 12 17 0 20 40 60 80 100 JDK 7 JDK 8 JDK 9 JDK 10 JDK 11 2011年7月 2014年3月 2017年9月 2018年3月 2018年9月 JDK 9は過去最多の機能追加 3年6ヶ月 2年8ヶ月 6ヶ月 6ヶ月 LambdaCoin Jigsaw JDK7 Plan B JDK7 Plan A Coin Coin Lambda JDK8 Plan B Jigsaw JDK9 Milling Coin
  • 40. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 従来のモデル メジャー・リリース 2年に一回機能追加 (目標) • 実際には不定期 (8は8ヶ月遅れ、9は1年6ヶ月遅れ) リリース内容 • 仕様書 • 互換テスト • リファレンス用ソースコード ベンダー各社によるバイナリ生成 新しいモデル フィーチャー・リリース 6ヶ月に一回機能追加 (固定) リリース内容 • 仕様書 • 互換テスト • リファレンス用ソースコード (Oracleの商用機能も含む) ベンダー各社によるバイナリ生成 あたらしい Java SE リリースモデル 40
  • 41. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 計画的なリリースに: Java SE の新しいリリース・モデル 3年6ヶ月 2年8ヶ月 Java SE 7 Java SE 8 2014年 3月 2011年 7月 2017年 9月 9 10 11 12 13 14 15 16 17 18 19 3月 9月 3月 3月9月 9月 3月 9月 3月 9月 2018年 2019年 2020年 2021年 2022年 3年に一度のバージョンに LTS (Long Time Support)を設定 6カ月に一度 機能追加 完成した機能 からリリース 定期的 不定期 大規模な機能の実装の 完成に左右されていた 完成している 中小の機能は 待機 41
  • 42. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 従来のモデル メジャー・リリース 後継版リリース後およそ1年間無償更新 年4回のリリース (1月,4月,7月,10月) 商用機能は利用不可 ライセンス: Oracle BCL (Binary Code License) ダウンロード: http://www.oracle.com 新しいモデル フィーチャー・リリース 後継版リリースまで無償更新 年6回のリリース (1月,3月,4月,7月,9月,10月) • 3月と9月に機能追加 商用機能も利用可能 ライセンス: GPLv2 + Classpath Exception • 公式 OpenJDK バイナリ ダウンロード: http://jdk.java.net なにが提供されるの?: Oracle が配布する無償用バイナリ 42 Java 11 以降の Oracle JDK OTN ライセンス下で無償利用可能。 ダウンロードは OTN から
  • 43. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Oracle が配布するバイナリの更新サイクル 9 9 9 10 10 10 Java SE 11 LTS (18.9) (有償更新) 11 12 12 13 13 14 14 15 15 16 16 Java SE 17 LTS (21.9) (有償更新) 17 18 18 Java SE 8 (有償更新) Java SE 7 (有償更新) Java SE 6 (有償更新) Java SE 8 無償更新 Non-corporate 3月 9月 3月 9月 3月 9月 3月 9月 3月 9月 2018年 2019年 2020年 2021年 2022年 2025年 3月 2026年 9月 2022年 7月 2018年 12月 2014年 3月 2019年 1月 2020年 12月 2017年 9月 6ヶ月に一度 機能追加 3年 8u20 (2014年8月) 8u40 (2015年3月) 8u60 (2015年8月) 限定機能追加 Interchangable: Oracle JDK とOpenJDKの機能的差分をなくす 無償更新 有償更新 無償更新 OpenJDKビルド from Oracle Oracle JDK バイナリ 43
  • 44. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | OpenJDK で使用可能になる Oracle JDK の商用機能 • Application Class-Data Sharing (Java SE 10) – http://openjdk.java.net/jeps/310 • ZGC (Z Garbage Collector) – http://openjdk.java.net/projects/zgc/ • Java Flight Recorder – http://openjdk.java.net/jeps/328 • Java Mission Control – http://openjdk.java.net/projects/jmc/ • Usage Logger – 公開に向けて作業中 JDK 11 から Oracle が配布する バイナリでサポートされない機能 • 含まれない機能 – 自動更新 – JavaFX (OpenJFX で引き続き利用可能) – Java Web Start と Web ブラウザ用 Java plugin • 利用できない形式 – 32ビット版バイナリ – 単独のJRE (JDK から jlink を利用して生成) 44 Oracle が配布するバイナリの変更点
  • 45. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Oracle のバイナリ・リリースのまとめ 現行のモデル 新しいモデル 無償版 機能の追加 メジャー・リリース 2年に一回 (目標) – 実際は不定期 フィーチャー・リリース 6ヶ月に一回 (固定) コードの管理 バージョン毎のマルチラインで管理 シングルラインで管理 機能追加とメンテナンスを継続的に行う 定期更新 内容 メンテナンス + 限定機能更新 メンテナンスのみ 回数 年4回 (1月, 4月, 7月, 10月) バイナリ Oracle JDK http://www.oracle.com/technetwork/java/javase/downloads/ • Oracle Binary Code License • 商用機能除く OpenJDK http://jdk.java.net/ • GPLv2 + Classpath Exception • JDK 8の商用機能も含む 長期サポート (有償) 対象のリリース すべてのメジャー・リリース 3年ごとのフィーチャー・リリース 定期更新 期間 Oracle Lifetime Support Policy 準拠 (最低8年) 内容 メンテナンス + 限定機能更新 メンテナンスのみ 回数 年4回 (1月, 4月, 7月, 10月) バイナリ Oracle JDK https://support.oracle.com 45
  • 46. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 46 使用中の JDK は そのまま 使い続けられる?
  • 47. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 考慮事項: ソフトウェアの脆弱性 対策をしていないシステムは狙われやすい 脆弱性修正済みパッチを適用するのが効果的な対策方法 47
  • 48. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | いつまで公式アップデートは提供される? 公式アップデート終了のスケジュール リリース 利用開始 (GA) 公式アップデート終了 の通知 公式アップデートの終了 (EoPU) 5.0 2004年5月 2008年4月 2009年10月 6 2006年12月 2011年2月 2013年2月 7 2011年7月 2014年3月 2015年4月 8 2014年3月 2017年9月 2019年1月 (non-corporate desktop use 2020年12月) 9 2017年9月 2017年9月 2018年3月 10 (18.3) 2018年3月 2018年3月 2018年9月 48 http://www.oracle.com/technetwork/java/eol-135779.html
  • 49. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 最新バージョンへ OpenJDKビルド from Oracle 49 公式アップデート終了後の更新版入手のオプション 商用ライセンスの購入 JDK 8 でバージョン固定 こちらがオススメ
  • 50. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 最新バージョンへの乗り換えの前に… 利用する機能に依存する選択肢 • Java Plug-in と Applet の利用 – 有償版でも定期更新は2019年3月まで – 動作している間に別のテクノロジーに移行することを推奨 • Java Web Start の利用 – 公式アップデート終了後、Java SE 8 の有償版で引き続き更新版の入手 – Java SE をバンドルしたアプリケーションとして配布することを推奨 • 32ビット版バイナリの継続利用 – 公式アップデート終了後、Java SE 8 の有償版で引き続き更新版の入手 50
  • 51. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java の商用サポート期間 リリース 提供開始 (GA) Premier サポート終了 Extended サポート終了 Sustaining サポート Java SE 5.0 2004年 5月 2011年 5月 2015年 5月 あり Java SE 6 2006年12月 2015年12月 2018年12月 あり JRockit 6 2009年 6月 2015年12月 2018年12月 あり Java SE 7 2011年 7月 2019年 7月 2022年 7月 あり Java SE 7 Deployment Technology 2016年 7月 設定なし あり Java SE 8 2014年 3月 2022年 3月 2025年 3月 あり Java SE 8 Java Web Start 2022年 3月 2025年 3月 あり Java SE 8 Java Plug-in 2019年 3月 設定なし あり Java SE 9 (non-LTS) 2017年 9月 2018年 3月 設定なし あり Java SE 18.3 (10) (non-LTS) 2018年 3月 2018年 9月 設定なし あり Java SE 18.9 (11) (LTS) 2018年 9月 2023年 9月 2026年 9月 あり Java SE 19.3 (12) (non-LTS) 2019年 3月 2019年 9月 設定なし あり 51 https://www.oracle.com/us/assets/lifetime-support-middleware-069163.pdf 注: Deployment Technology: Java Plug-in と Java Web Start
  • 52. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java SE 9 以降へのアップグレードを見据えた これからの開発 • 非推奨 API の利用は避ける – @Deprecated(“forRemoval=true“)となった API には特に気をつけよう • 内部 API の利用は控え、Java Platform Module System に移行する – アプリケーションのモジュール化は必須ではない – 明記されている API のみを利用しよう • https://docs.oracle.com/javase/10/docs/api/overview-summary.html • 不要なモジュールは外す • 利用しない新機能は気にしない – アップデート・リリースは確認しよう • 一つのJarファイルで複数の Java SE のバージョンに対応させる • セキュリティ・ロードマップも確認 – https://www.java.com/en/jre-jdk-cryptoroadmap.html 52
  • 53. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | • Module System (Jigsaw) 何のため? JDK 9 以降で大きく異なる機能 構成の確実性 依存関係を宣言することにより、エラーを起こしやす いクラスパスのメカニズムを置き換える 強力なカプセル化 public タイプに対するアクセスコントロールを実現 (内部向けパッケージへの外部からのアクセスを制限) Module 宣言 public ≠ すべてアクセス可能 依存関係が解決された (= 必要なモジュールで 構成された) カスタム JRE をビルドすることが できる 53 • 関連する JEP (JDK Enhancement Proposal) – JEP 261: Module System – JEP 200: The Modular JDK – JEP 201: Modular Source Code – JEP 220: Modular Run-Time Images – Plus • JEP 260: Encapsulate Most Internal APIs • JEP 282: jlink: The Java Linker JDK 9 では Module System の導入によって JDK の仕組みが大きく変更さ れています。 それに伴い内部 API へのアクセスが使用不可になったり、Deprecated な API の削除など後方s互換性に制限が出てきます。
  • 54. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | jdk1.8.0 jdk-9 Java SE 9 からの変更点: JDK ディレクトリ構成の変更 (JEP 220: Modular Run-Time Images) $JAVA_HOME bin - 実行コマンド lib tools.jar rt.jar include db jre src.zip $JAVA_HOME bin - 実行コマンド conf - 設定ファイル jmod - モジュール定義 (コンパイル済み) lib - 内部実装 (直接参照や変更不可) *.properties, *.policy など (必要に応じて変更可能) include legal – モジュール単位のcopyright や license src.zip 54
  • 55. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java SE 9 からの変更点: JDK/JRE: 廃止された機能 • tools.jar(JDK) と rt.jar(JRE) • Extension メカニズム (JEP 261) – java.ext.dirs システムプロパティがセットされていると起動エラー – lib/ext ディレクトリが存在すると起動エラー • Endorsed Standards Override メカニズム – java.endorsed.dirs システムプロパティがセットされていると起動エラー – lib/endorsed ディレクトリが存在すると起動エラー • JRE バイナリは提供されなくなる (Java 11) – jlink でビルドは可能 55
  • 56. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java SE 9 からの変更点: JEP 260: Encapsulate Most Internal APIs • 内部 APIの大半はカプセル化され使用不可に – 広く使われてしまっていた内部 API (Critical APIs) は代替が提供されるまでは 使用可能 • 内部実装の静的な利用の確認方法 – -jdkinternals オプションで jdeps を実行 • リフレクションを使用した内部実装の動的な利用の確認方法 – 実行時の java.lang.IllegalAccessException の情報を活用する • カプセル化の解除用オプションでアクセス可能 – 実際に削除されているAPIもある – : 内部実装APIの互換性は保障されない (通知なしに変更される可能性あり) 56
  • 57. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Java SE 9 からの変更点: JEP 277: Enhanced Deprecation • @Deprecated 注釈に属性を追加可能に – since: いつから非推奨になったか – forRemoval: 将来のリリースで削除される予定か @Deprecated(since=9, forRemoval=true) 57
  • 58. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 参考: JDKに付属するツール • 非推奨 API の確認 – ソースコード内の利用: javac の –deprecation オプション – バイナリ内の静的な利用: jdeprscan コマンド • 内部 API の利用の確認 – バイナリ内の静的: jdeps コマンドの -jdkinternals または --jdk-internals オプション – バイナリ内の動的: java コマンドの --illegal-access=<warn or debug> オプション • 必要なモジュールのみで構成するカスタムJREの生成 – jdeps で必要なモジュールの確認 – jlink で不要なモジュールの削除 • マルチ・リリース JAR ファイル – jar コマンドの --release オプション 58
  • 59. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | In the future … • Project Amber – JEP 325 Switch Expressions (Java 12) – JEP 326 Raw String Literals (Java 12) – JEP 286 Local-Variable Type Inference (var) (JDK 10 でリリース済み) – JEP 323 Local-Variable Syntax for Lambda Parameters (JDK 11) • Project Loom – Fiber と Continuations を使った並列処理 • Project Panamas – JVM と ネイティブコードの相互接続 (ベクター演算のサポート) • Project Valhalla – Value Type と Generic Specialization (プリミティブ型 参照型) 59
  • 60. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 後編のまとめ • スキルアップ。やっぱり必要です。 –Java SE 9 は実は重要なリリースです • Module System の導入による機能変更の影響が大きいのでしっかり把握。 –JVM まわりの変更点は、開発者も運用担当者も押さえておく • 非推奨になる API や内部 API はなるべく使用を避けましょう –Java プログラミングの基礎知識がないと新機能や変更点の評価も難しい… • リリースモデルの変更も押さえておきましょう –現時点での Java SE 9 以降の現実的な移行先は Java SE 11 (JDK 11) です • 利用する機能によっては JDK 8 + 有償サポートも選択肢に。 60
  • 61. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Oracle University 教育サービスご紹介 研修コースと認定資格 61
  • 62. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | アプリケーション・アーキテク チャ設計の考え方を理解したい データベースで SQL がどのように処理されるかを理解し 効果的な SQL チューニングの方法を理解したい JVM の仕組みを 詳しく理解したい アプリケーションサーバーのアーキテクチャや運用管理方法を理解したい Java EE アプリケーションの 開発方法を理解したい Java によるオブジェクト指向をしっかり理解したい ラムダ式や Stream API を使った プログラミングを理解したい より実践的なスキルを 手を動かしながら定着させたい Java EE システム開発のためのラーニングパス - 正しく技術を理解するために - Java SE 8 プログラミング I (3日間) Java SE 8 プログラミング II (3日間) Java EE 7 アプリケーション開発 (5日間) Oracle WebLogic Server 12c: 管理 I (5日間) Java EE エンタープライズ・ アプリケーションの設計 (5日間) Java SE 8 新機能 (2日間) 62 Java オブジェクト指向 プログラミング (3日間) Oracle Database 12c: 管理 ワークショップ (5日間) UNIX/Linux 入門 (3日間) Webシステム構築 クイック・スタート (3日間) Oracle Database 12c: SQL 基礎 I (3日間) 開発に必要になる技術要素を詳しく学習したい 高度な技術を詳しく学習したい Java パフォーマンス・チュー ニング (3日間) Oracle WebLogic Server 12c: トラブルシューティング (2日間) スキル強化 ワークショップ - Java 実装編 - スキル強化 ワークショップ - Middleware 実装編 - スキル強化 ワークショップ - SQL チューニング編 - Oracle Database 12c: SQL チューニング ワークショップ (3日間) Web システムの全体感を 知りたい OS の操作方法を覚えたい データベースの基本と SQL の 書き方を覚えたい
  • 63. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | おすすめ研修コース (1) Java オブジェクト指向プログラミング 概要 このコースでは、Java によるオブジェクト指向プログラミングにフォーカスして説明します。クラスとインスタンス、カプセル化、 継承、ポリモフィズムなど、オブジェクト指向プログラミングに不可欠な知識から、デザインパーターンなどオブジェクト指向に おける設計の考え方と UML の書き方を、演習を通して実践的に身につけることができます。 【注】このコースは、「Java SE 7/8 プログラミング I」コースをカスタマイズして実施します。 学習トピック  Java 言語入門  Java 言語の文法  オブジェクト指向プログラミング 1  オブジェクト指向の概念の理解  クラスの定義とインスタンス化  メソッド・コンストラクタの定義と オーバーロード  static 変数と static メソッド  オブジェクト指向プログラミング 2  継承  メソッドのオーバーライド  インタフェースの使用  参照型の型変換  例外処理  java.lang パッケージ  デザインパターンと UML  Composite / Factory Method / Strategy / Singleton / Adapter / Builder / Visitor / Observer / Command / Façade  UML の基本的な書き方 (ユースケース図, クラス図, シーケンス図) 受講前提条件 • 「Java プログラミング for ビギナーズ」受講相当の知識 • 「Java SE 7/8 プログラミング I 」受講相当の知識 (推奨) コース日数 3日間 63 ※1 太字でハイライトした章に重点をおいて講義を行いま す。 ※2「デザインパターンと UML 」の章は、補足資料を使用 します。それ以外の章は「Java SE 7 プログラミング I」コー スのテキストを使用します。
  • 64. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 64 おすすめ研修コース (2) Java SE 7 New Features Java SE 8 までをじっくりキャッチアップ。 オラクルユニバーシティでは、Java SE 7 / 8 の新機能を効率的に学習することができる研修コースを提供し ています。Java SE 7 / 8 で加わった新機能をわかりやすい講義と実機演習を通してをじっくり・しっかり身に つけることができます。 コース 概要 このコースではJava SE 7の主な変更点と新機能の詳細を説明します。このコースはJava SE 6ある いはそれ以前のバージョンのJava SEを使用した開発経験があるJava技術者が対象になります。 コースの受講者は、Java SE 7の変更点と新機能を深く理解し、Java SE 7を使用したアプリケー ション開発を行えるようになります。 学習 内容 言語仕様に対する小さな変更(JSR 334) 動的言語呼び出しのサポート(JSR 292) 並行処理とコレクションにおける拡張(JSR 166Y) ネットワークとファイルシステムアクセスに関する拡張 (JSR 203) JDK 7におけるその他の拡張 日数 2日間 Java SE 8 新機能 コース 概要 このコースでは、Java SE 8の主要な変更点および機能拡張について詳しく学習します。新機能の 概要を理解するとともに、ラムダ式、コレクションを操作するためののStream API、日時操作のため の新しい Data and Time APIの使用方法を学習することができます。 学習 内容 Java SE 8での変更点の概要 関数型インタフェースとラムダ式 java.util.funcation パッケージ Stream API によるコレクション操作 並列 Stream Date and Time APIの使用 Nashornを使用したJavaでのJavaScript処理 Mission Control および Flight Recorder の概要 日数 2日間
  • 65. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | おすすめ研修コース (3) Java パフォーマンス・チューニング 概要 このコースでは、Java SE 7で導入されたG1 GCをはじめとした様々なガベージコレクションの仕組みを理解するとともにJVM の最適化手法について学習することができます。また、Java Flight RecorderおよびJava Mission Controlを使用したアプリケ ーションのプロファイリングやモニタリングを方法を学習することができます。 学習項目  パフォーマンス・チューニングの基本的なアプローチ  世代別ガベージコレクションの仕組み  G1 GCの仕組み  アプリケーションおよびJVMレベルでのモニタリング  Java Flight RecorderおよびMission Controlを使用したアプリケーショ ンのプロファイリングとモニタリング  オペレーティングシステム・レベルでのパフォーマンス監視  ガベージコレクション方式の選択によるチューニング  アプリケーションのチューニング 受講前提条件 • 「Java SE 7/8 プログラミング I 」の受講または受講相当の知識 • 「Java SE 7/8 プログラミング II 」の受講または受講相当の知識 (推奨) コース日数 3日間 65
  • 66. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | スキル強化ワークショップ 66 問題発生 なぜ 起こる? どう 直す? どう 防ぐ?コース 概要 このコースでは、適切なシステム化を行うために理解しておきたい実装、および設計のポ イントについて学習します。単純な実装レベルの注意事項から設計時における注意事項 まで、開発現場で実際に起こりがちな事象を題材に、それを見逃すとどうなるか?解決す るにはどうするかをワークショップ形式の演習と経験豊富な講師によるわかりやすい講 義を通して理解することができます。 ねらい 実際に起こりえる事象に対する対応方法をワークショップ形式で体験することで • 事象の調査方法など現場対応能力を向上させる • 設計や実装で陥りがちなミスを理解する • 本来どのように設計・実装するべきかを理解する 設計・システム化能力の強化につながるエッセンスを 実例から学ぶことができます 設計・システム化能 力の強化 Java EE ベースのシステム開発を行うために押さえておきたい勘所を押さえる
  • 67. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | スキル強化ワークショップ - Java実装編 - 67 コース 概要 このコースでは、アプリケーションの実装に関する考慮事項について学習します。テーマ別に、陥りがちな実装上 のミスとそれが引き起こす事象について理解すると共に、設計時・実装時においてどのように考慮することが望ま しいかについて理解を深めます。講義はワークショップ形式で実施し、問題のあるアプリケーションの実装の確認 からプログラム修正による解決までを体験しながら学習することができます。 コース 内容 マルチスレッドに関する問題 誤った例外の扱い リソース・リーク 文字列の操作とローカライズ デザインパターン コーディングのアンチパターン 日数 3日間 価格 担当営業までご相談ください
  • 68. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | Javaプログラミングスキルを客観的に証明する世界共通の認定資格です。 Oracle 認定 Java 資格 設計者の意図を正しく理解して独力で 機能実装が行えるレベル (中上級Javaプログラマ向け) Gold資格は、コレクションAPI, ファイルI/O, 並行処理、JDBCなどのコア・ライブラリを使 用方法と Java SE 8 の新機能である Lambda 式や Stream API を使用した関数スタイ ルのプログラミング方法を理解していることを証明します。 加えてデザインパターンについても問われるため設計から実装までの包括的なスキル を身につけていることを証明します。 (Global資格: Oracle Certified Professional, Java SE 8 Programmer) 上級者の指導のもとで実装コードや テストコードを書けるレベル (初級Javaプログラマ向け) Silver資格は、Java言語の基本文法とオブジェクト指向プログラミング(クラス、インタ フェース、例外処理)を理解しているかどうかが主な出題項目です。また、基本的な Lambda 式の書き方やDate and Time API の基礎を含めたプログラミングのために必要 とされる仕様を詳細に理解していることを証明します。 (Global資格: Oracle Certified Associate, Java SE 8 Programmer) Javaによるオブジェクト指向 プログラミングを覚えたレベル (言語を初めて学ぶプログラマ向け) Bronze資格は、Java言語の基本文法(変数宣言や制御文)とクラスや メソッドの定義などJavaプログラミングの基本を理解しているかどうか が主な出題項目です。言語初学者が理解するべき基礎項目を理解し ていることを証明します。 Oracle Certified Java Programmer, Gold SE 8 Oracle Certified Java Programmer, Silver SE 8 Oracle Certified Java Programmer, Bronze SE 7/8 「なんとなく書ける」から「理解し て書ける」へ 標準に準拠した確かな実装スキルは、生 産性や保守性の向上に貢献することがで きます。 Oracle 認定 Java 資格は、Java プログラ ミングスキルを客観的に証明する 世界共通の認定資格です。 • Java SE プログラミング・スキルを 網羅的に証明 • Bronze, Silver, Goldとスキルを段 階別に認定 • 世界共通*の認定資格 = 技術者同士の共通プロトコル * Silver/Gold 資格は Global 資格と同時認定されます。Bronze 資格は日本のみの資格です。 68
  • 69. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 「実務で役立つ資格」 「キャリア形成に役立つ資格」 第 1 位 新バージョンの試験を 選択する受験者の割合 資格試験の年間受験者数 2013 年から 4 年間で約 2.5 倍に Oracle 認定 Java 資格の価値 #1 【出典】IT技術資格に関する意識調査 - 株式会社アイ・ティ・アール (2016 年) X2.5 92% Java SE 資格試験に占める Java SE 8 試験受験者の割合 (2017 年) 本資格試験は単に資格を取得して終わるようなものではなく、実務にも活用できる 非常に実践的な内容になっていると思います。 OCJP Gold 資格試験はデザインパターンの基礎もその試験範囲に入っているため コーディングスタイルを初めとした開発標準を規定するアーキテクトといった指導的 な立場にある場合に、自分の力を客観的にはかる道具として取っておくことには大 きな メリットがあると思います。 単純に Java の文法を丸暗記しただけでは取得できないものとなっています。体当 たりで覚えざるをえなかった Java 文法などを体系的に学ぶことで平均的な Java プ ログラマから頭一つ抜けた存在になれると思います。 【資格取得者の声】 69
  • 70. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 70