0

org.joda.time.LocalDateに移行したいjava.util.Dateを使用し、期待しているコードがたくさんあります。問題は、ほとんどのコードが動的に型付けされることです。

したがって、ClassCastExceptionをインターセプトし、実行時に変換を実行し(例外をバブルアップさせるのではなく)、操作をログに記録する(コードを修正できるようにする)ためのグルービーな方法があるかどうか疑問に思います。

例:

import org.joda.time.LocalDate

def someMethod(date) {
    println date.year()
}

// this call is ok
someMethod(new LocalDate())

// this call raises an exception
someMethod(new Date())

2番目の呼び出しをtry-catchで囲み、正しいタイプでリコールするなど、上記のコードを変更したくありません。これをグローバルに行う方法が欲しかった。

4

1 に答える 1

0

アイデア 1:

Groovy マルチメソッドの恩恵を受けることができます: JodaTime のメソッド オーバーロードを記述し、動的メソッド パラメータの場合は java.util.Date メソッドを選択させます。

def someMethod(date) {
    println date.year()
}

私のアドバイスは、変換を行うこれらのメソッドのオーバーロードをこのクラスに記述することです。

def someMethod(LocalDate date) {
    someMethod date.convertToJavaDate()
}

そのコードにアクセスできない場合は、メタプログラミングを使用できます。


アイデア 2:

巨大なライブラリがある場合は、JodaTime クラスを混在させたほうがよいと思います。ダックタイピングからパワーメリットが得られます。java.util.Date のどのメンバーが呼び出されているかを把握し、それらを Joda 独自のメソッドに再ルーティングする必要があります。

class LocalDateMixin {
  def year() { this[Calendar.YEAR] }
}

LocalDate.metaClass.mixin LocalDateMixin

拡張メソッドを使用してメタプログラミングを適用することもできます。

于 2013-01-15T11:50:49.270 に答える