Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

オブジェクトの変換にコンストラクタを使ったときの問題

背景

  • MyBatisのSqlSession#selectOne()で、クラスAのオブジェクトaを取得している。SELECTの結果が0件だった場合はnullが返る。
  • オブジェクトaを、別のクラスBのオブジェクトbへ変換したい。

問題となる設計

クラスBのコンストラクタが、引数にクラスAのオブジェクトを取るようにした。

発生した問題

クラスAのオブジェクトがnullだった場合(SELECTの結果が0件だった場合)、変換結果もnullになってほしい。一方、Javaのコンストラクタはnullを返すことができない。

解決策

コンストラクタによる変換は行わないようにする。

クラスAのオブジェクトaをクラスBのオブジェクトbへ変換するstaticメソッドpublic static ClassB convertFrom(ClassA a)を、クラスBに新設した。

隘路事項

  • このようなケースに名前は付いているのだろうか?(インスタンス生成を抽象化したい訳ではないので、Factory Methodパターンとも違うし……)

  • このようなケースで、staticメソッドに付ける名前としては何が適切だろうか? よく使われる命名はあるだろうか?

    • convertFrom() …… 今回採用した命名だが、PowerShellっぽい匂いがする。
    • create() …… 悪くないが、Factory Methodっぽいと誤解されるかも。
    • build() …… Builderパターンっぽいので却下。
    • instanceOf() …… どう見てもSingletonオブジェクトが返りそうなので却下。