メソッドチェインと型変換
文字列型とか配列型とかは一般的な型なので、
Hoge.toString()
とか
Hoge.toArray()
みたいなメソッドがあっても
違和感ないし、
Stringの方に引数としてHogeをとるコンストラクタ
String(Hoge hoge)
があるというのもおかしな気がします。
String(Object obj)
が中で
obj.toString()
を呼ぶというのが普通かなあ。
つまり、特殊な型を一般的な型に変換するのであれば、 どう変換するかの実装は特殊な型が持つべきということになるのかな。 Stringが組み込みの型というイメージだからそうなるのかもしれないけど、 自分で2つの型を定義して、相互に変換できるようにするときには、 どっち側にメソッドを持たせるかはよく考えた方がいい、と思います。
で、組み合わせるとこんなことができるわけで、
hoge.toString().toArray()
つまりメソッドチェインなのですが、
new Array(new String(hoge))
と等価ということにしましょう。
どうせ疑似コードだし。
一方で、
Hoge(Array array)
というコンストラクタがあったとしましょう。
Hogeはあるアプリケーションのために作った特殊な型ということにしましょう。
だとすると
Array.toHoge()
というメソッドがあるべきではなくて、
hoge = new Hoge(new Array(string))
か
hoge = new Hoge(string.toArray())
という風に記述することになるのかな。
でも記述としては括弧が入れ子になるより、
hoge = string.toArray().toHoge()
の方が見やすいと思う。これは気分の問題かなあ。
Arrayのメソッドを追加できるとしたら、
Array.toHoge()
を追加してもいいのだけど、こういうのが追加できたら便利そうだと思いました。
Object to(Class cls) {
return new cls(this);
}
それで、
hoge = string.toArray().to(Hoge)
みたいにして使うの。
疑似コードだから適当だけど、型にうるさいという設定にするとキャストして、
hoge = (Hoge)string.toArray().to(Hoge)
こんな感じかな。うーん。