2013-01-15 36 views
0

我有很多代码使用并期望java.util.Date,我想迁移到org.joda.time.LocalDate。问题是大部分代码都是动态输入的。拦截Groovy中的ClassCastException?

所以我不知道是否有任何常规的方法来拦截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第二个电话并用正确的类型回顾。我想要在全球范围内做到这一点。

+1

如果2.0使用@Typed来防止这种情况发生 – farmer1992

+0

您可以发布一些代码片段吗? – Will

回答

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被称为并重新路由它们乔达自己的方法:

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

LocalDate.metaClass.mixin LocalDateMixin 

您也可以申请使用extension methods元编程。

+0

想法1可能有效。我将不得不编写和使用一百种转换​​方法,而我不会迁移所有的代码。我想,元编程方法会更好,我会深入研究这一点。 – tuler

+0

你有多少班级需要这种转换? – Will