torutkのブログ

ソフトウェア・エンジニアのブログ

Java読書会「Practical Design Patterns for Java Developers」(第4回)を終えて

11月18日(土)に、Java読書会BOF主催のJava読書会「Practical Design Patterns for Java Developers」を読む会(第4回)を開催しました。

本日は、会場確保が出来なかったので、オンライン(Skype)で開催しました。

オンライン読書会の手段

Java読書会BOFでは、コロナ禍の際にオンライン開催を幾度か実施しました。そのときは、MicrosoftのTeams(無料アカウント枠)を利用しました。Java読書会は通常10:00から開始し、17:00までの7時間、途中で随時休憩を挟みながら実施しています。オンラインでのWeb会議では、人数制限と時間制限があるものが多く、当時は無料枠では TeamsがJava読書会の開催に合致していました。

さて、今回オンライン開催とする際に、Teamsは無料版では会議の時間が最大60分と制限されるようになっており、検討の結果 Skypeを使うこととしました。Skypeは特に時間の制限がないようで、画面共有もできました。

読書会メモ

今回も、「Practical Design Patterns for Java Developers」(洋書)の電子版(PDF)をGoogle翻訳したものをつかって朗読で進めました。電子版(PDF)は、紙の書籍を購入した場合、出版社にエビデンス(領収証)を送ると 

ソースコードの部分は翻訳が入ると読みにくいので英語のPDFで朗読しました。第4章「構造に関するデザインパターン」(p.101から)と第5章「振る舞いに関するデザインパターン」の途中、インタープリタパターン(p.150まで)を読みました。

UML図について

各パターンの説明において、UMLクラス図が示されていますが、図の誤記が多く見かけられました。

インタフェースを実装する関連線が、◁- - - - (点線)ではなく、◁-----(実線)となっていた。

UML 2.0のクラス図では、インタフェースはインスタンス化できない抽象型で、それを実装するクラスとの間は、三角記号と点線(InterfaceRealization)で結ぶのですが、この書籍では多くが実線(Generalization)で結ばれています。

ダウンキャストのswitchパターンマッチ

Adapterパターンのサンプルコードに次がありました。

sealed interface Engine permits ElectricEngine, PetrolEngine {...}
class ElectricEngine implements Engine {...}
class PetrolEngine implements Engine {...}

class Vehicle {
    private final Engine engine;  
      :
    public void refuel() {
        switch (engine){
        case ElectricEngine de -> {
          :
        }
        case PetrolEngine pe -> {
          :
        }
        default -> throw new IllegalStateException("Vehicle has no engine");

JDK 21で正式機能となったJEP 441 Pattern matching for switchが使われています。 switchで、Engine型のengineを渡すと、caseで、具象型に基づく選択ができます。なるほど、これはキャストやinstanceofがまったく登場せずにダウンキャストの選択ができています。

さらに、sealedでEngineインタフェースを実装する型をElectricalEngineとPetrolEngineに限定しています。すると、上述コードのdefaultはいらないのでは? と削除してみてもコンパイル通りました。

その他メモ
  • java.util.Propertiesクラスは、JDK 1.0からのAPIで、Hashtableを継承しています。互換性のため変更できませんが、実装ではConcurrentHashMapを内部でつかって、プロパティはこれにput/getしています。

  • コマンドパターンのところで、サンプルコードではrecord型を使っていました。 ここで、enumを使ってもいいのではとの議論をしました。enumでは、列挙子毎に異なるメソッドの実装を記述できます。

  • JDK 21までの新しい機能についての書籍がなかなか出ていませんが、この本は何気にJDK 21の機能まで(プレビューで少し前のJDKバージョンから試せていますが)使っているので、デザインパターンだけでなくJavaの新機能の知識も付きますね。(第1回、第2回はデザインパターンの章にたどり着けず、Javaの深い機能、新機能で終始していました)