2017-10-18 65 views
0

你好,我有一個關於在常規使用TimeCategory問題。 在我的項目,我得到了計算幾個月獨特方法。我想將它添加到TimeCategory中。Groovy的擴展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() { 

}

does not工作:(

回答

1

一對夫婦的事情秒。

  1. 擴展方法必須定義爲靜態的。該方法的第一個參數聲明獲取定義方法的類型和實例。後續參數是該方法的實際參數。這在Groovy metaprogramming documentation中有更深入的解釋。
  2. 你不一定需要擴展方法添加到TimeCategory,以便能夠使用它作爲一個擴展方法。 The use method適用於任何班級。

例如:現在

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定義的擴展方法,您可以窩use方法:

use(MonateAboCategory) { 
    use (groovy.time.TimeCategory) { 
     println new Date() + 3.months 
     println new Date() - 1.monateAbo  
    } 
} 

,也可以定義自定義的擴展類作爲TimeCategory一個子類:

class MonateAboCategory extends groovy.time.TimeCategory { 
    static int getMonateAbo(Integer val) ... 
} 

use(MonateAboCategory) { 
    println new Date() + 3.months 
    println new Date() - 1.monateAbo  
}