在 Groovy 中转换对象的约定似乎是使用as
operator 和 override 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
但是,GrailsasType()
在运行时覆盖了所有对象的实现,以便它可以支持像render as JSON
.
另一种方法是在 Grails Bootstrap 类中重写asType()
如下:
def init = { servletContext ->
Id.metaClass.asType = { Class type ->
if (type == FormattedId) {
return new FormattedId(value: value.toUpperCase())
}
}
}
但是,这会导致代码重复 (DRY),因为您现在需要在 Bootstrap和Id 类中重复上述操作,否则as FormattedId
将无法在 Grails 容器之外工作。
在 Groovy/Grails 中编写不会破坏良好代码/OO 设计原则(如 Single Responsibility Principal 或 DRY)的转换代码有哪些替代方法?Mixins 在这里有用吗?