Groovy扩展了TimeCategory类

时间:2017-10-18 12:03:21

标签: groovy

您好我有一个关于在groovy中使用TimeCategory的问题。 在我的项目中,我有独特的计算月数的方法。我想将它添加到TimeCategory。

public Integer calcMonateAboDays(def fromDate) {
Date startDate
if (fromDate instanceof String) {
    startDate = fromDate.toDate()
} else if (fromDate instanceof Date) {
    startDate = fromDate
} else {
    assert false: "Wrong fromDate class: " + fromDate.getClass()
}
Date endDate = null
use(TimeCategory) {
    endDate = startDate + 1.month

    Calendar endCalendar = Calendar.getInstance()
    endCalendar.setTime(endDate)
    int lastDayOfMonth = endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)
    int endDayOfMonth = endCalendar.get(Calendar.DAY_OF_MONTH)

    Calendar startCalendar = Calendar.getInstance()
    startCalendar.setTime(startDate)
    int startDayOfMonth = startCalendar.get(Calendar.DAY_OF_MONTH)

    if (lastDayOfMonth != endDayOfMonth || startDayOfMonth == lastDayOfMonth) {
        endDate--
    }
}
return (endDate - startDate) + 1
}

如何将其添加到现有的TimeCategory类中,以便像这样使用:

Date date = new Date()
use(TimeCategory) {
    System.out.print(date + 1.monateAbo)
}

这样的东西:

TimeCategory.metaClass.getMonateAbo() {

}

不起作用:(

1 个答案:

答案 0 :(得分:1)

有几件事。

  1. 扩展方法必须定义为static。该方法的第一个参数声明了获得定义方法的类型和实例。后续参数是该方法的实际参数。这在Groovy metaprogramming documentation
  2. 中有更深入的解释
  3. 您不一定需要将扩展​​方法添加到./result/result_Text_1364_3.png,以便能够将其用作扩展方法。 The use method适用于任何课程。
  4. 例如:

    TimeCategory

    现在,如果您希望能够在自定义扩展类中同时使用class MonateAboCategory { static int getMonateAbo(Integer instance) { // do calculations } static int getMonateAbo(Date instance) { // do calculations } } use(MonateAboCategory) { println new Date() - 1.monateAbo println new Date().monateAbo } 中定义的扩展方法,则可以嵌套TimeCategory方法:< / p>

    use

    或者您可以将自定义扩展类定义为use(MonateAboCategory) { use (groovy.time.TimeCategory) { println new Date() + 3.months println new Date() - 1.monateAbo } } 的子类:

    TimeCategory