【发布时间】:2015-10-15 12:59:26
【问题描述】:
如果我有这样一个 groovy 类:
class WebSession{
String firstName
String lastName
String email
}
我希望能够使用自动设置器来设置值。例如:
WebSessionuser = new WebSession()
webSession.firstName = 'John'
但是让它调用的 setter 做一些额外的事情,比如记录一些东西或将对象持久化到缓存。
如何在不必手动定义所有设置器的情况下做到这一点?到目前为止,我有这样的东西,但我不能让它工作:
webSession.properties.each{ key, value ->
if ( key != 'class' ) {
String methodName = "set${key.capitalize()}";
WebSession.metaClass[key]."${methodName}" = { -> delegate
System.out.println("Setting key: ${key}");
webSession[key] = delegate;
}
}
}
另外,我不知道循环遍历属性名称减去“类”是否很麻烦,并且有更好的方法来获取声明的字段。
【问题讨论】:
-
通常你应该避免像这样的 getter/setter 的副作用。
-
是的,我知道你的意思,因为它在欺骗自己在做什么,特别是如果你使用像 webSesssion.firstName = 'John' 这样的简写......你不想欺骗开发者谁认为它只是设置一个字段。但是在这种情况下,它是一个特殊的类,我们知道它总是会被持久化到会话和/或缓存中,我们希望它自动发生,而不必编写大量的管道代码来在每个 setter 上做同样的事情。
标签: groovy