2017-10-18 12 views
0

こんにちは、私はGroovyで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() { 

}

doesntの仕事:(

答えて

1

カップルs。

  1. 拡張メソッドはstaticとして定義する必要があります。メソッドの最初の引数は、定義されたメソッドを取得する型とインスタンスを宣言します。後続の引数は、そのメソッドの実際の引数です。これは、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  
} 
関連する問題