【问题标题】:Lazy initialization of object passed as argument作为参数传递的对象的延迟初始化
【发布时间】:2013-06-27 14:13:24
【问题描述】:

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

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

【问题讨论】:

  • 是的,您的具体问题是什么?
  • 我想我很清楚我的问题是什么。我正在寻找一种方法来做某事。问题中解释了这一点。我误解了你的评论吗?
  • 使java.lang.reflect.Constructor成为方法conditionalCreate中第二个参数的类型。或者MethodHandle 是否合适?或者甚至是dynamic proxy

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


【解决方案1】:

不确定这是否是您的意思,因为它看起来很简单,但是:

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

【讨论】:

  • 这种方法的问题是我必须将Foo 硬编码到方法中,我正在寻找一种方法来传递Foo 和任何必要的初始化参数 这个函数。使功能可以更通用的使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多