假设我有一个需要很长时间来创建对象的方法,
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中是否可以这样?
答案 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();
}