モジュールシステムについて 【Java】
モジュールシステムというのが、SE9から導入されました。大まかにいうと、パッケージよりも上にモジュールという括りができまして、module-info.javaというモジュール定義ファイルに、自身のモジュールが公開するパッケージをexports ******;
という感じで指定して、そのモジュールが利用したいモジュールの名前をrequires *****;
という感じで指定します。Java SE11 Silverですとそれぐらいしか出題されなかったようですが、Goldではprovides, with, opens, usesというキーワードも問われるようです。
以前からあるリフレクションという、クラスの定義情報を調べることでインスタンスが具体的に何型かを知らなくても動作させることができる技術の関連で、公開はしないけれどリフレクションではアクセスできるようにするopensというキーワードもあります。公開を許可するモジュールを限定する時は、opens ****** to *******;という風にtoの後にモジュール名を書きます。toの後が複数の場合、カンマで区切ります。
usesは、SPI(サービスプロバイダーインタフェース)として利用するインタフェース名を書きます。
そして上記のSPIを実装するライブラリ側の準備として、ライブラリ側のmodulue-info.javaに、provides (SPIのインタフェース名) with (実装クラス名)を指定します。
インターフェイスと抽象クラスの違い【Java】
通常のクラスですと、いくつかフィールドや具象メソッドがあります。抽象クラスになると、少なくとも一つ以上の抽象メソッドが定義されます。
インターフェイスとは、クラスに含まれるメソッドの具体的な処理内容を記述せず、変数とメソッドの型のみを定義したものです。
抽象クラス自身にはabstract修飾子をつけて、継承するクラスにはクラス名の後にextends 抽象クラス名 をつけます。多重継承はできません。
インターフェイス自身にはinterface修飾子をつけて、実装するクラスにはクラス名の後にimplements インターフェイス名 をつけます。複数実装する時は、「,」区切りで並べます。
試験対策として、タイトルの「インターフェイスと抽象クラスの違い」として、以下の件を覚えておきたいです。
・インターフェイスにはインスタンスフィールドを定義できないが、抽象クラスには定義できる。
・インターフェイスには protected なメソッドを定義できないが、抽象クラスには定義できる。
オートボクシング、アンボクシング【Java】
プリミティブ型同士だと暗黙の型変換(int -> doubleなど)できるけど、ラッパークラス同士だとできません。(Integer -> Doubleはダメ)
ボクシングというのはラッパークラスに入れること。アンボクシングはラッパークラスからプリミティブ型にすること。
Optionalって何 【Java】
Optional<T>って名前ではあまりイメージできませんが、nullかもしれない<T>型を包み込む型です。nullチェックが簡潔に書けるという感じでしょうか。Java8から追加されているようです。
ScheduledExecutorService(遅延実行)あたり【Java】
scheduleメソッドとか、scheduleAtFixedRateあたりを調べておきました。
scheduleの方は最初の遅延時間を引数で指定できます。
scheduledAtFixedRateは、最初の遅延時間、インターバルが指定できます。そしてどちらもその遅延時間、インターバルの時間単位をTimeUnit列挙型で指定するだけです。
実行する時はこんな感じでシングルスレッドを用意して、
ScheduledExecutorService execTest = Executors.newSingleThreadScheduledExecutor();
execTest.schedule(ラムダ式, 時間, TimeUnit.SECONDS);
終える時にはexecTest.Shutdown();
名前が長いので覚えにくいです。