作为参数传递的对象的延迟初始化

时间:2013-06-27 14:13:25

标签: java lazy-initialization first-class-functions

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

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;
}

首先尝试加载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中是否可以这样?

1 个答案:

答案 0 :(得分: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();
}