Grails中如何在Organization领域类实现toString()方法
嘿,我来帮你搞定这个toString()方法的实现!先给你捋清楚步骤,顺便纠正代码里的小问题~
第一步:修正属性定义的小错误
你代码里的属性定义加了引号(比如String "orgName"),这在Groovy里是不对的,会导致语法错误,应该去掉引号,改成标准的属性声明:
String orgName String orgEsta String orgLogo String orgDesc String orgLoc
第二步:实现
toString()方法 Groovy对字符串处理非常友好,有两种实用的实现方式,满足不同需求:
方式一:固定属性拼接(直观易读)
如果类的属性数量固定,直接用Groovy的字符串插值把每个属性的值拼进去,输出清晰,适合日常调试和日志打印:
String toString() { // Groovy里可以省略return关键字,直接返回GString "Organization(orgName: $orgName, orgEsta: $orgEsta, orgLogo: $orgLogo, orgDesc: $orgDesc, orgLoc: $orgLoc)" }
当你打印Organization对象时,就会输出类似Organization(orgName: 我的开源组织, orgEsta: 2020, orgLoc: 北京)的字符串,一目了然。
方式二:动态获取属性(灵活扩展)
如果以后可能给类新增属性,不想每次都修改toString(),可以动态获取对象的属性,过滤掉Groovy自带的metaClass和静态的constraints,还能自动排除null值:
String toString() { // 过滤掉不需要的系统属性,只保留自定义的非空属性 def validProps = this.properties.findAll { key, value -> !['metaClass', 'constraints'].contains(key) && value != null } // 把属性键值对拼接成字符串,再包裹类名 "Organization(${validProps.collect { "$it.key: $it.value" }.join(', ')})" }
比如如果orgLogo属性为null,它就不会出现在输出里;以后新增属性也不用改这个方法,会自动包含进去。
第三步:测试效果
创建一个Organization对象并打印,JVM会自动调用toString()方法:
def myOrg = new Organization( orgName: "Stack Exchange", orgEsta: "1999", orgLoc: "New York" ) println myOrg // 输出就是toString()返回的内容
内容的提问来源于stack exchange,提问作者AB21
相关产品推荐
相关产品推荐

