読者です 読者をやめる 読者になる 読者になる

白猫のメモ帳

JavaとかJavaScriptとかHTMLとか機械学習とか。

OCJP SE8 Goldに合格しました

こんばんは。

新しいiPohoneに変えようかちょっと悩んでいます。
5sユーザなのでサイズが大きくなるのが・・・。


さて、少し前の話ですが、オラクル認定Javaプログラマの試験に合格しました。

f:id:Shiro-Neko:20161008211505p:plain
(※写真差し替えてます。わたしはネコ科ではない。)

Goldは参考書が長らく出ていないのを言い訳に受けていなかったのですが、
いつのまにやらちゃんと発売していたので、覚悟を決めて受けることにしました。

SE7 GoldからのUpgrade試験の記事などは見かけるのですが、
SE8 Silverが前提資格であるSE8 Goldの試験についての記事は見かけなかったので、
これから受ける人の参考になるといいかなと思って、記事にしておきます。

勉強するぞ


というわけでまずはテキストのリンクを張っておきます。

オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)

オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)

いまのところこれしか売っていないので、選択肢とかはないです。
初版?なので、ちょっと誤植は多め。2つ選べって書いてあって回答が1つしかないのには困りました。

なにはともあれ、これの内容を全部覚えればちゃんと合格できます。
わたしの学習時間は2~30時間くらいだったような気がします。

試験内容とポイント


Oracleの公式によると、試験内容は↓のリンクの通りです。
Java SE 8 Programmer II| Oracle Certification Exam

Upgrade試験はラムダ祭りらしいですが、この試験の祭りは若干大人し目です。でも、いっぱいでます。
範囲がとても広いので、リンク先のトピックに沿って気を付けたほうが良いポイントをピックアップしましょう。

テキストの章も若干名前が違う程度で、この題目に沿って作られています。

Java クラスの設計

Silverを受けた人にとっては、カプセル化や継承といった基本的な仕様はそんなに難しくはないと思います。
イミュータブルオブジェクトの定義、列挙型の使い方、
hashCode、equalsのオーバーライド時のルールあたりはちゃんと確認しておきましょう。
デザインパターンについてはシングルトンのみ?

高度なJavaクラスの設計

抽象クラスやインタフェース、内部クラスなどについて広く問われます。
インタフェースはdefaultメソッドとstaticメソッドの定義が可能になっているので、
これについてはしっかり確認しましょう。

interface A {
    defalut void method() {}
}
interface B {
    defalut void method() {}
}
class C implements A, B {
    // void method() {} // 実装クラスでオーバーライドすればOK
    // void method() {
    //    super.A.method();
    //} // 親をコールするときにはsuperを使ってもよい
}

ネストクラスやローカルクラスについての問題もあります。
privateやabstractは使えるかとか、static変数にアクセスできるかとか、内部インタフェースはOKかとか。
(というかローカルクラスなんて普段使わないよ・・・)

ジェネリクスとコレクション

クラスジェネリクスとメソッドジェネリクスは一通り使えるようにしておきましょう。

ArrayListとかHashMapとかは使う機会が多いので、そんなに苦労はしません。
が、MapはCollectionのサブインタフェースじゃないとか、VectorはListの実装クラスとか意外と知らなかったりして。

Dequeについての問題は結構出るみたいなので、
addとpushを混在で要素を入れて、popとremoveでそれぞれ取り出すとどうなるかとか確認しておいたほうがいいです。

コレクション、ストリームおよびフィルタ

StreamAPIについては次節のラムダとともに今回の目玉なのでしっかり勉強する必要があります。
Streamインタフェースの持つ中間操作、終端操作メソッドの機能と引数の関数インタフェース型は要チェック。

collectメソッドに渡すCollectorを生成するCollectorsクラスのメソッドはしっかり覚えましょう。
たとえば、summingIntの戻り値はInteger型で、averagingIntの戻り値型はDouble型とか。

Optionalについても絶対に問題が出ます。
ofとofNullableの違いとか、getとorElseとorElseGetの違いとかは完璧にしておきましょう。

プリミティブストリームは…特に難しいことはないかな…?

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

ここも時間をかけるべきところです。
まずは主な関数型インタフェースをちゃんと覚えましょう。

(str) -> System.out.println(str)

はConsumer(受け取った値を消費するので消費者)

(val) -> val * 2

はUnaryOperator(一つ受け取ってそのままの型で返すから一項演算子

とか。いったん和訳してみるとわかりやすいかも知れませんね。

あとはどういったときにメソッド参照が使えるのかとういうのは大事です。
要するに関数の参照なので、メソッドの中身が欲しい関数インタフェースと一致しているかってだけです。

例外とアサーション

覚えることがそんなに多いわけではないですが、問題としては結構複雑になりやすいです。

Java7で追加されたtry-with-resourcesとマルチキャッチについてはよく問題になるので要確認。
また、rethrowについても7から仕様が変わっているので見ておきましょう。

アサーションは…メッセージがなくてもいいよってくらいでしょうか?

Java SE8の日付/時刻APIを使用する

Date/Time APIもJava8で刷新された機能なので、しっかりと復習しておく必要があります。

ofやparseメソッドにどういう引数を渡すとエラーになるのか、ならないのかとか。
LocalDateTime、OffsetDateTime、ZonedDataTimeの違いと相互変換とか。

よくひっかけで出るのはplusDaysとかの戻り値を再代入していないパターンですね。

Duration、Period、Instantを別の初期化方法で初期化をした場合、
toStringを掛けたら等価になるかとかいう問題もよく出そうです。

あと、日本ではあまり関係ないですが、夏時間の問題はでます。

JavaのI/Oの基本

ここに関してはいわゆる日常的にファイルの読み書きで使うI/Oについてです。
各Stream、Reader、Writerの挙動をちゃんと確認しておきましょうって感じですね。

この次のNIO.2の方がメインですかね。

JavaのファイルI/O(NIO.2)

Java7から新登場したNIO.2ってやつです。(これ何て読むんでしょう?わたしは「におつー」って読んでますが)

FileからPathが分離したっていうのが何となくのイメージでしょうか。
従来はFileが両方の役割を持っていたのが、パスに関する部分とファイルの中身に関する部分が分かれたというか。

PathとFileにどんなメソッドがあるのは当然要チェックです。
Pathのnormalize、resolve、relativiseはよく問われますのでしっかりと。

また、Filesにかなり多くのメソッドがあるので、それぞれの挙動はちゃんと確認する必要があります。
Pathsはちょっとしかないです。

Javaの同時実行性

いわゆるスレッドのお話です。
正直WebアプリでしかJava開発していないわたしには結構つらかったです。
(スレッドなんてものはコンテナが勝手にやってくれるんだよ…)

synchronizedは・・・まぁいいですね。普通です。
同期化コレクション系はコレクションの問題のような気もしますが、ここで出てきます。

ExecutorServiceとRunnable、Callableあたりから問題のコードが追いづらくなります。
Fork/Joinフレームワークもとても読みづらい問題ですね。
とはいっても戻り値の有無とか例外の種類とか、問題になりやすいところはある程度限られているため、
変に難しい問題だったらあきらめるとかいう選択肢もありだと思います。(時間かかるし)

パラレルストリームの問題も出ますが、順序保障されないよくらいに思っておけばいいんじゃないかと。

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

最近はO/Rマッパーはいろいろあるので、素のJDBCはあんまり触る機会がないですよね。
Class.forNameっていう呪文があってね・・・なんて話をすることもあまりないです。
これ、JDBC4.0からはいらないんですよ。(あ、これちゃんと問題で出ます)

StatementとResultSetの挙動についてちゃんと覚えればOKなんですが、ほんのりとSQLの知識は必要です。
最低限CRUDの各分の構文くらいは知っておいた方がよいです。

ResultSetってnextでとっていくばかりで、カーソル(?)の操作って普通はあんまりしないですよね。

ローカライズ

Localeとリソースバンドルについてです。
Localeは意外とnewでのインスタンス生成ができたりして、ちょっと混乱します。

リソースバンドルはクラスとプロパティ両方がでるので、ごっちゃにならないように。
注意すべきは型の違いでしょうか。

リソースバンドルの検索の優先度はちゃんと確認しましょう。
クラスとプロパティどっちが優先かとか、言語コードに一致するものがないとデフォルトロケールをとるとか。

所感


とても大雑把に書きましたが、要するに範囲は広いです。
Streamなどの目玉機能はお役立ち度も高いのでモチベーションが上がるのですが、
普段あまり使わないような機能のところが結構辛かった印象です。

とはいっても、やはり一通り勉強すると自分の得意でないところがよくわかりました。

せっかくならゴールドですよね。かっこいいしね。
そんなわけで、皆さんもよければぜひ受けてみてください。

それでは。