2013-01-15 65 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