ライブラリ化したクラス拡張コードを呼び出すスマートな方法は?
metaClassを使用してクラスを拡張する場合、拡張処理をどんな風に一元管理しようかいつも迷う。
いつもやっている方法は以下のとおり。
- Extention.classというクラスを作成
- 拡張処理を記述
- 利用したいコードの先頭で拡張処理の呼び出し。
具体的に例を。
Extention.groovy
String.metaClass.define{ toFile{ def file = new File(delegate) file?.exists()?file:null } }
Test.groovy
#!/usr/bin/env groovy import Extention Extention.main() println "/home/genzou".toFile().parent println "/home/dummy".toFile()
呼び出したい拡張処理を記述したクラスのmainメソッドを呼び出す。
使用する側のコードをもうちょっと短くするなら、以下のとおり。
Extention.groovy
class Extention{ static{ String.metaClass.define{ toFile{ def file = new File(delegate) file?.exists()?file:null } } } }
Test.groovy
#!/usr/bin/env groovy import Extention Extention // Class.forName("Extention") でも同じ println "/home/genzou".toFile().parent println "/home/dummy".toFile()
ほんのちょっとしか変わらないけど。いきなりクラス名を記述されてもなにがなんだかっていうのもある。
ライブラリ化した拡張を使用する場合にはどんなやり方がスマートなんだろう?
ディスカッション
コメント一覧
まだ、コメントがありません