-1

假设我有一个方法需要很长时间才能创建一个对象,

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) {
        /* ... */
    }
}

我想要一个函数,它首先尝试加载由 指定的序列化对象filename,但如果失败,则创建该对象default。它可能看起来像这样:

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

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 中这样的事情可能吗?

4

1 回答 1

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();
}
于 2013-06-27T14:19:02.310 回答