この度はJava SE 8 Goldを受験しました。Silverを取ったのが去年の9月末だったので、およそ半年ぶりの受験ですね。以前、Silverの方を受験した時はポストでその感想を書いていたので、今回も同じくGold受験後の感想を書こうと思います。
Generics
Genericsに関する問題は、型が明確ではない場合をとう問題が多かったです。例えばとあるクラスを継承しているクラスのみを引数として受けたい場合はどうするか、とかの問題ですね。<? super X>
と<? extends X>
の違いがよくわからないと難しくなる、そのような問題です。
また、Genericsに関しての問題はComparator<T>
とComparable<T>
も登場していて、これからどう違うか、またどこで必要となるものかを理解していないと難しい問題になっていました。個人的にはあまり使ってないAPIだったので最初は苦戦した問題でした。理解できればなるほど、となりますが、これからもそんなに使うことあるかどうか…でも確かに知っておけば便利そうな気はしますので覚えておきたいAPIです。
Lambda
Java 1.8の重要機能であるLambdaはやはり問題数が多いです。Lambdaはただ単にメソッドの書き方が楽になったということだけではなく、それを活用できる関数型インタフェースやStreamなど、他の重要なAPIと関係がある重要なAPIですので、やはりこれがわからないと本当の意味でJava 1.8を理解していないと言えるでしょう。
Lambdaに関する問題は、関数型インターフェースの条件(SAM)やjava.util.functionパッケージで提供しているインターフェースの種類を理解していないと解けないものが多い感じでした。また、Method Referenceに関する問題も出題されています。Lambdaをしっかり理解していれば書き方が違うだけというのがわかりますが、そうでないとコードすら読めないかもしれません。
Stream
Streamは問題の割合が多いです。Java 1.8で追加された重要なAPIの一つでもあり、今までのJavaのAPIとは性格がちょっと違うものでもあるのでなんとなく感だけで使っていた自分には大変勉強となりました。今まではせいぜいstream()やcollect()くらいしか使ってなかったのですが、今回の試験でこれから色々Streamを活用できる箇所が増えていくような気がします。
個人的には既存のコードが問題なく作動していていればわざわざStreamに変える必要があるくらいではないものの、関数型プログラミングの特徴を少しでも味わえる素敵なAPIと思います。例えば問題では中間操作と終端操作の違いやそれぞれのメソッドの活用方法などに関する質問が出ていて、それらしきメソッド名を並べては「次の中、〇〇APIのメソッドとして正しいものを選びなさい」のような意味のない問題に比べ、APIそのものの特徴と使い方を理解できないと解けない問題となっている感じがして好きでした。特に、peek()やsorted()、Collectors.groupingBy()のような良いメソッドが出てきて嬉しかったです。
I/O
基本的にはJava 1.7から追加されたNIOに関する問題が多かったです。これもまたStreamと結び付けるためか、lines()やlist()、walk()などのメソッドに関して問う問題が多かったですね。また、同じく1.7から登場したtry-with-resourceに関する問題も出たのでよかったと思います。
自分の場合はファイルI/Oで主にNIOのFilesクラスを使うことが多いので馴染んでいるのもあって、close()をわざわざ呼び出さなくても安全なAPIを提示してくれるってことはこれからの習慣にもいい影響を与えるだろうと思います。
個人的には仕事でもAutoCloseableを継承したクラスを作ったこともあったので嬉しかったです。
Thread
並行性に関する問題も割合的には多い感じでした。AtomicIntegerやExecutorServiceのような重要なAPIを学ぶ良い機会となりましたが、せっかくRunnableやCallableまで扱っているので、CompletableFutureまで扱ってくれていたらよかったのでは、と思いました。CyclicBarrierが出ていましたが、最近はあまり使われてないらしいですしね。スレッドはそこまで難しくなく、ForkJoinPoolとCyclicBarrier、RunnableとCallableのシグニチャをちゃんと覚えておいたら解ける問題が多かった気がします。
Temporal
LocalDateTimeなどのAPIに関する問題が少し出ていましたが、割合は低め。Silverでも扱っていたAPIなので、こちらではフォーマッターや例外になるパターンに関する問題が多かったような気がします。ZoneIdなども出てきましたが、そこまで重要ではないような印象でした。
Locale
こちらもまた割合は低め。ただ、プロパティーをどう読み込むかはLocaleだけでなく環境変数などを扱う時も必要な知識となるため、覚えておくかちはあると思います。APIのシグニチャを問う問題の場合はインターネットでも十分情報を得ることができるのでわざわざ覚える必要はあるのかな?といったところですが…
他に
JDBCに関する問題も少々ありましたが、やはり今はあまり使われてないので問題の数は少なかったです。自分の場合はJavaでのDB処理にはMybatisやJPAを使っているのでわざわざJDBCを使うことはないのですが、基本的にJavaではこういう風にDBにアクセスして処理をしているんだな、ということだけ分かれば十分なのではと思っているので、問題の割合としては適切だったかなと。
また、SilverまではJavaのAPIをちゃんと覚えているかを問う問題が多いような気がしますが、Goldからはクラス設計に関する問題もいくつか出ていて、カプセル化やシングルトンクラスをどう実装するべきかに関する問題や、Files.walk()による再帰処理などに関する問題もあったのですが、Goldを受験する人がそのような知識がないとは思えないのですね。
一つ、せっかく同じような使い方(メソッドチェイン)をしていて、Streamで要素を取得する時も使えるOptionalについては言及されてないことは残念に思います。他と同じくJava 1.8で導入されたものなのになぜ…?って感じですね。
最後に
去年はJava SE 11の資格も登場したので、最初からそちらにした方がよかったかなとも思いましたが、Oracleの公式ホームページの試験の紹介だとJava 9から導入されたモジュールシステム以外はあまり試験の内容が変わってないようです。
8も11もLTSバージョンなので、次のLTSである17がリリースされたら、おそらく資格も更新される可能性があります。個人的には12から14まで導入された新機能の方が便利だと思うので、私のように勉強の目的で受験していて、元々8の資格を持っている方ならあまり11へのアップグレードはメリットがないかもしれません。もちろん、これから初めて資格を取得する人にとっては11の方が良いでしょう。自分はそんなことも知らずにとりあえず8を受験してしまったのですが…
とりまとめ、資格取得は嬉しいことですが、何よりも勉強のため始めたJavaの資格が、思っていたより仕事で役立つ知識を提供していたので満足しました。問題自体はパターンをよく覚えだけで解けるものも多いのですが、JavaのAPIに対する理解を深めたい方なら、受験してみて損することはないと思います。受検料は高いですが…