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の深い機能、新機能で終始していました)