2013-06-27 66 views
0

比方說,我有一個需要很長的時間來創建對象的方法,對象的初始化工作作爲參數傳遞

public class Foo implements Serializable { 
    public static Foo create(...){ 
     /* (takes a long time) */ 
    } 
} 

我也有序列化和反序列化對象的一個​​輔助類,

public class Pickle { 
    public static void dump(Serializable obj, String filename) { 
     /* ... */ 
    } 
    public static Object load(String filename) { 
     /* ... */ 
    } 
} 

我想用一個原型類似的功能:

public Object conditionalCreate(String filename, Object default) 
{ 
    Object obj = null; 
    try{ 
     obj = Pickle.load(filename); 
    } 
    catch(Exception e){ 
     obj = default; 
    } 
    return obj; 
} 

是第一次嘗試到L添加由filename指定的序列化對象,那麼如果失敗,則創建對象default

現在編寫conditionalCreate函數的方式,default將始終創建,這不是我想要的 - 只有在必要時纔會延遲創建default對象。

在另一種語言中,conditionalCreate功能可能看起來像:

public Object conditionalCreate(String filename, Function defaultConstructor){ 
    Object obj = null; 
    try{ 
     obj = Pickle.load(filename); 
    } 
    catch(Exception e){ 
     obj = defaultConstructor(); /* Note the difference here */ 
    } 
    return obj; 
} 

此外,我想辦法將參數傳遞給這個默認的構造函數,如果對象的建設是必要的(如果反序列化失敗)。

在Java 7中是這樣的可能嗎?

+0

是的,你有什麼確切的問題? – jlordo

+0

我覺得我很清楚我的問題是什麼問題。我正在尋找一種方法去做一些事情。問題中解釋了一些事情。我誤解你的評論嗎? – jedwards

回答

0

不知道這是你的意思,因爲它看起來非常簡單,但是:

public <C> C conditionalCreate(String filename, Class<C> defaultType){ 
    try{ 
     //try to return loaded element 
     return (C) Pickle.load(filename); 
    } 
    //if it fails log the error 
    catch(Exception e){ 
     Logger.log("Exception happened", e); 
    } 
    return defaultType.newInstance(); 
} 
+0

這種方法的問題是我必須將'Foo'硬編碼到方法中,我正在尋找一種將'Foo'和任何必要的初始化參數*傳遞給*函數的方法。這樣該功能可以更普遍地使用。 – jedwards

+0

查看我的更新回答。這足夠普遍了嗎? – darijan

相關問題