Groovy でオブジェクトを変換するための規則は、as
演算子とオーバーライドを使用することasType()
です。例えば:
class Id {
def value
@Override
public Object asType(Class type) {
if (type == FormattedId) {
return new FormattedId(value: value.toUpperCase())
}
}
}
def formattedId = new Id(value: "test") as FormattedId
ただし、Grails はasType()
実行時に for all オブジェクトの実装を上書きして、 のようなイディオムをサポートできるようにしrender as JSON
ます。
asType()
別の方法として、Grails Bootstrap クラスを次のように書き直すこともできます。
def init = { servletContext ->
Id.metaClass.asType = { Class type ->
if (type == FormattedId) {
return new FormattedId(value: value.toUpperCase())
}
}
}
ただし、これはコードの重複 (DRY) につながります。BootstrapとId クラスの両方で上記を繰り返す必要があるためです。そうしas FormattedId
ないと、Grails コンテナーの外部では機能しません。
単一責任プリンシパルや DRY などの優れたコード/OO 設計プリンシパルを壊さない、Groovy/Grails での変換コードの記述に代わるものはありますか? ミックスインはここで役に立ちますか?