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()
对于运行时的所有对象,以便它可以支持像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 和 Bootstrap 中重复上述操作andId 类,否则as FormattedId
在 Grails 容器之外无法工作。
除了在 Groovy/Grails 中编写转换代码之外,还有哪些替代方案不会破坏良好的代码/OO 设计原则(例如单一职责原则或 DRY)? Mixin 在这里有用吗?
您可以使用 Grails 支持Codecs http://grails.org/doc/latest/guide/security.html#codecs自动添加encodeAs*
您的 Grails 原型的函数:
class FormattedIdCodec {
static encode = { target ->
new FormattedId((target as String).toUpperCase()
}
}
然后您可以在代码中使用以下内容:
def formattedId = new Id(value: "test").encodeAsFormattedId
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)