2017-10-18 5 views
0

Bonjour J'ai une question sur l'utilisation de TimeCategory dans groovy. dans Mon projet, j'ai une méthode unique pour calculer les mois. Je veux l'ajouter à TimeCategory.Groovy étendre TimeCategory class

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 
} 

Comment puis-je ajouter à la classe de TimeCategory existant à utiliser comme ceci:

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

Des trucs comme ceci:

TimeCategory.metaClass.getMonateAbo() { 

}

travail ne marche pas :(

Répondre

1

Une chose s.

  1. Les méthodes d'extension doivent être définies comme statiques. Le premier argument de la méthode déclare le type et l'instance obtenant la méthode définie. Les arguments suivants sont les arguments réels de cette méthode. Ceci est expliqué plus en détail dans le Groovy metaprogramming documentation. Il n'est pas nécessaire d'ajouter la méthode d'extension à TimeCategory pour pouvoir l'utiliser comme méthode d'extension The use method fonctionne avec n'importe quelle classe.

Par exemple:

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 
} 

Maintenant, si vous voulez être en mesure d'utiliser les deux méthodes d'extension définies dans TimeCategoryet dans votre classe d'extension personnalisée, vous pouvez imbriquer use méthodes:

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

vous pouvez également définir la classe d'extension personnalisée en tant que sous-classe de TimeCategory:

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

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