Java Gold 勉強ログ

Oracle認定資格であるJava Gold(Java SE 11 Programmer II)のための勉強ログです。Javaを5年以上触ってきた人のログです。Java Silverの時の勉強ログは下記サイトです。

資格のサイト

https://www.oracle.com/jp/education/certification/1z0-816-jpn-31705-ja.html


教材

Java SIlverの時と同様いわゆる黒本を使いました。

試験の範囲がSilverよりも格段に広くなっており、自分が普段触らない分野が出ることは明確だったため黒本を使っています。
試験の範囲は資格のサイトに一覧があります。

Silverと比べ黒本の内容そのままという問題は少ないように思いました。ただ、パラメータをいじっただけの問題は多数出るので、考え方を理解していれば問題なく解き進められます。

全く知らない分野に関しては問題の解説で概要を掴むことができました。解説を一通り眺めておけばその分野についてわかった気分にはなれます。DateFormatの4種(FULL, LONG, MEDIUM, SHORT)など他のパラメータはどんなのかなと思う時にちゃんと載っているので本番でパラメータをいじられた時にも対応しやすいです。
問題の解説そのものは長めの解説の中から探さないといけないですし、肝心の問題の説明がほんの少ししかない時にはちょっとがっかりします。

教材自体は1周すれば十分です。

試験内容

試験サイトの「試験内容チェックリスト」に載っている分野について紹介します。

全体を通して

Java Silverの時は言語の文法や仕様を理解した上での間違え探しがメインでした。Java Goldは標準APIの内容を理解した上での間違え探しが増えます。
もちろん言語の仕様を理解した上で解く問題も多いのですが、SilverよりもAPIの内容に関する知識量が求められます。
メソッドの名前、引数、戻り値を覚えているかが問題を解く鍵になります。

Silverよりも問題のコードは読みやすいです。setterなのにsetしていないとかgetterなのにvoidといった問題は出ません。コンストラクタで初期化、getterで取得のルールを守っている問題が多いのでそこで間違え探しは必要ありません。

varがJava 11の試験では入ります。varは基本的にどんな型でも入ると問題を解く上では思っていいので、正解が1個しかないのに以下のような選択肢が出てきたら1, 2は選択肢から外せます。

1. var a = getInt();
2. int b = getInt();
3. var c = getString();
...

Javaの基礎

finalと書いてあるときは大体オーバーライドしようとしているので、継承関係だけ見ていれば問題ないです。他の箇所でfinal指定されていることはほぼないように思います。
インナークラスのインスタンス作成は(自分が)あまり外からやらないので書き方に慣れていませんでした。以下のサイトの説明が網羅的でわかりやすいです。内部クラスは使ったことないのでへ〜と思いましたがこれからも使わないと思います。

enumは特別な扱いを受けているのでその辺りを覚える必要があります。コンストラクタがprivate固定だったり、自動で定義されるメソッドがあることなどです。やはり以下のサイトで網羅されています。

例外処理とアサーション

try-with-resourcesはよく使われるので必須です。書き方であったり、AutoClosableとの関係などを問われます。どの例外をキャッチできるか、どのリソースが閉じられるかをコードから読み取ることも必要です。

アサーションは書き方と有効にする方法を押さえておくのがいいと思います。メッセージを入れる書き方が他ではあまり見ない方法なので覚えました。

assert value != null;
assert value != null : "Value musu not be null";

Javaのインタフェース

Java8からdefaultが追加されたりJava9からprivateが追加されて大きく変わりました。
オーバーライドできる/できないの区別や、インスタンスのフィールドを定義できない(public static final相当になる)ことを問われます。抽象クラスとの違いも必須です。
またシグニチャーの異なるインターフェースを複数実装(implement)した際にどのような挙動になるか、知っておく必要がります。コンパイルエラーが多数ですがたまに実行時エラーになるケースがあります。

interface A {
  default int getInt() { return 1; }
}
class B { private int getInt() { return 2; } }
class C extends B implements A {}

new C().getInt() // java.lang.IllegalAccessError

interfaceを直接実装していればコンパイルエラーですが、上の例のように間接的に実装されている場合にはコンパイルが通ります。

汎用とコレクション

ジェネリクス(Generics)です。List<?>の<>で挟まれている部分のことではありますが、型変数のないraw型の形もよく出題されます。Java 11のテストを受ける人がそんなuncheckedでwarningのでるコードを頻繁に書くとは考えにくいので、ここは学習しないと挙動がわからないと思います。

ジェネリクスを指定していればその型を使うのはわかると思いますが、指定していない場合はraw型で宣言されていた場合のコードの書き方が問われます。raw型やワイルドカードの場合はObjectをジェネリクスを指定したのと似た動きになることが多いです。

List a = List.of("a", "b");
a.stream().filter((Object c) -> c != null)

Comparator, Comparable のメソッドの違いも大事です。名前と引数の数を抑えましょう。

Double a = 1; というコードはアウトです。double a = 1;は許されますが。Double a = 1d;ならOKです。

関数型インタフェースとラムダ式

関数型インターフェイスの条件を抑えましょう。staticがあっていいのか、defaultは許されるのか、privateはどうなのか、@FunctionalInterfaceは必須なのかなど。

あと実質的finalにひっかかるかどうかもひっかけになりそうです。

JavaストリームAPI

Streamはparallelの挙動に迷うことがよくあります。それ関連だとforEachOrderedの挙動も抑えるといいと思います。

終端処理をした後にそのStreamを使い回すことはできない(実行時エラー)ので気をつけましょう。

組込み関数型インタフェース

関数型インターフェースは暗記です。名前、定義されたメソッドの名前と引数と返り値の型、型引数の数を覚えさせられます。

ストリームに対するラムダ演算

map, flatMap, filterの挙動は必須です。Streamの処理の順番も独特なので抑えましょう。peekの挙動に深く関連します。

collectによる終端処理はたくさんの種類があるので是非とも覚えておきたいところ。groupByとその他もろもろを組み合わせると色々できます。
また、toListがStreamに生えたのはJava 16なのでJava 11では使えません。
averageを出す場合にどのような手段があるか、何が返ってくるか覚えましょう。

findFirstなどのOptionalを返す終端処理は返り値を覚えましょう。通常の値なのかOptionalかでのちに続く処理が変わります。
OptionalではifPresentとisPresentが紛らわしいので注意しましょう。voidのメソッドは返り値がないので変数に代入はできません。

モジュール型アプリケーションに移行する

比重として大きくないように思います。トップダウン移行とボトムアップ移行の違いを抑えるといいです。

モジュール型アプリケーションにおけるサービス

module-info.javaに書く内容は覚えましょう。exportsなどです。Service Loaderと絡むとおの得ることが多くなりますが、ある構成に対してどのような指定が必要なのか考えられるといいです。

並列処理

ThreadやExecutorServiceに関する内容が出ます。Runnableは値を返さない、Callableは返せる、あとどうやって値を取り出すかを抑えればいいと思います。
あとはメソッドの名前を見ればどの用途で使えるのかはわかると思います。

並列ストリーム

forEachとforEachOrderedの違いを聞かれます。Collector.ofの3番目の引数の内容にも関連します。

I/O(基本およびNIO2)

File, Path(Files)について問われます。またReaderとかWriterとかもよく出てきます。try-with-resourcesと組み合わせることの多い箇所です。
ファイルが存在するのにその場所にファイルをコピーしようとしてくるので騙されないようにしましょう。存在する場合は普通エラーが出ます。
Filesにはファイルの内容を取得するための便利なメソッドが多いのですが、返り値の型を覚える必要があります。Streamで返ってきたりStringで返るメソッドもあるので。
シリアライゼーションや、シリアライゼーション特有のtransient, writeObject, readObjectの働きも抑えましょう

Java SEアプリケーションにおけるセキュア・コーディング

個人的には一番何を言っているのかよくわからなかった箇所ではありますが、消去法でなんとかなります。
黒本に出てきた内容を覚えるだけで十分です。

JDBCによるデータベース・アプリケーション

データベースへの接続情報とStatementについて問われます。
PreparedStatementのパラメータ指定で、1回実行した後に2回目はパラメータを変更しないと前回実行のパラメータがそのまま使われるのは意外でした。

ローカライズ

Localeがでます。コンストラクタや、staticで定義されている定数にどんなものがあるか見ておくといいと思います。
多言語化についてもここで問われます。どのpropertiesファイル読み込まれますかとかそもそも読み込む方法を聞かれます。

アノテーション

実行時に保持されるもの、コンパイル時にしか見られないものなど様々あることを抑えましょう。また、アノテーションで設定したデータの取り出し方が必要です。

感想

recordなくてよかったです。新しい機能が増えるたびに覚えることは増えるので大変です。


この記事が気に入ったらサポートをしてみませんか?