重写隐式getter时,Grails域类会出现意外行为

时间:2015-06-22 10:02:19

标签: hibernate grails groovy

考虑以下grails域类:

Test.groovy

package test

class Test {    
    Integer month
    Integer year
    String performancePeriod = ""

    static constraints = {      
        month(range:01..12, nullable:true)
        year(range:2010..2020, nullable:false)
        performancePeriod(nullable:true)        
    }

    String getPerformancePeriod() {
        if(month) {
            "${month?.toString().padLeft(2,'0')}.${year?.toString()}"
        }
        else {
            getYearStringFormat()
        }
    }

    String getPerformancePeriodDate(){
        return new GregorianCalendar(year, month, 1).time
    }

    String getJahrStringFormat() {
        year ? year.toString() : ""
    }

    String getMonatZweiStellig() {
        month? month.toString().padLeft(2,'0') : ""
    }   
}

这是遗留代码。我知道设计很糟糕,因为表示逻辑绑定到域对象。通过表示逻辑,我的意思是属性performancePeriod,其唯一目的是提供表示年份和日期的字符串格式。

现在,生成控制器并构建视图。如果您创建新的Test记录而未设置performancePeriod,则将使用方法getPerformancePeriod中给出的逻辑隐式设置该属性。

我无法理解这种行为。我知道设计首先是糟糕的,特别是因为函数依赖{year, month} -> performancePeriod,但是什么时候performancePeriod保存到数据库中?在我决定设置值之前,为什么我决定不让它为空?

1 个答案:

答案 0 :(得分:1)

  

为什么在我决定设置值之前,我决定不让它为空?

你可以。当持久性引擎持久化您的对象时,它必须询问对象以检索特定属性的值。当引擎询问您的performancePeriod属性的值时,您永远不会返回null。无论你告诉它performancePeriod属性的值是什么,持久性引擎都会持续存在。您在域类中遇到了混乱的问题,并且您所描述的行为是因为存在问题。

你的课程写作方式很奇怪有几个原因。 performancePeriod字段永远不会用于任何事情。我无法从你的问题中确定,但可能是因为你没有区分字段的定义和属性的定义。