0

我有很多代码使用并期待 java.util.Date,我想将它们迁移到 org.joda.time.LocalDate。问题是大部分代码都是动态类型的。

所以我想知道是否有任何常规方法来拦截 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())

我不想修改上面的代码,比如用 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 回答