モジュールシステムについて 【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 なメソッドを定義できないが、抽象クラスには定義できる。

 

enum(列挙型)とは?【Java】

Javaで使う列挙型は、その型に入る値が決まっているものをまとめたものです。

例えば、曜日の列挙型ならば、「月火水木金土日」の七種類しかないので、それ以外は入力できない(されない)ようにできるという事です。

 

試験対策ですが、この列挙型をコンストラクタは、privateでしか修飾できません。一度にいくつものインスタンスを作る事がないからでしょうか。書かなくても暗黙的にprivateになります。

オートボクシング、アンボクシング【Java】

プリミティブ型同士だと暗黙の型変換(int -> doubleなど)できるけど、ラッパークラス同士だとできません。(Integer -> Doubleはダメ)

ボクシングというのはラッパークラスに入れること。アンボクシングはラッパークラスからプリミティブ型にすること。

Runnable と Callable

クラスのインスタンスが他スレッドで実行することを想定してデザインされている、という意味で、CallableのインターフェイスはRunnableに似ています。
両者の違いは、Runnableは戻り値の指定が出来ず例外としてRuntimeExceptionしかスローできないのに対し、Callableは戻り値を指定可能でどんな例外もスローすることができる点です。

ScheduledExecutorService(遅延実行)あたり【Java】

scheduleメソッドとか、scheduleAtFixedRateあたりを調べておきました。

scheduleの方は最初の遅延時間を引数で指定できます。

scheduledAtFixedRateは、最初の遅延時間、インターバルが指定できます。そしてどちらもその遅延時間、インターバルの時間単位をTimeUnit列挙型で指定するだけです。

 

実行する時はこんな感じでシングルスレッドを用意して、

ScheduledExecutorService execTest = Executors.newSingleThreadScheduledExecutor();

 

execTest.schedule(ラムダ式, 時間, TimeUnit.SECONDS);

 

終える時にはexecTest.Shutdown();

 

名前が長いので覚えにくいです。