我正在寻找一种方法来制作此操作的通用函数:
SomeObject object = (object != null) ? object : SomeObject.default();
假设SomeObject.default()
返回SomeObject的默认实例。
我想我需要一个像:
这样的界面public interface Defaultable {
public /* static */ Defaultable default(); //corrected
}
功能如:
public Defaultable defaultIfNull(Defaultable someOb){
return (someOb != null) ? someOb : Defaultable.default();
}
除非最后一个函数调用失败,因为我们需要具体类的静态方法,而不是接口。
有解决方法吗?
答案 0 :(得分:3)
不,不是真的 - 作为参数传递的null
没有任何类型信息。你不能用通用工厂做到这一点,因为为此你需要手头的类型来获得正确的工厂对象。
第三方面,为什么你需要这种模式吗?
答案 1 :(得分:1)
public static <T> T replaceIfNull(T objectToCheck, T defaultValue) {
return objectToCheck == null ? defaultValue : objectToCheck;
}
replaceIfNull(getXdata(),BigDecimal.ZERO).add(getYdate));
答案 2 :(得分:0)
从界面中删除静态。这不是必需的。
答案 3 :(得分:0)
怎么样:
public <T> T firstNonNull(T ... vals) {
// omitted
}
这不完全是你想要的,但更通用(和有效)。
答案 4 :(得分:0)
一步一步实施:
第1步
public abstract class Defaultable {
public abstract Defaultable defaultMethod();
public Defaultable defaultIfNull(Defaultable someOb){
return (someOb != null) ? someOb : defaultMethod();
}
}
第2步
public class DefImpl extends Defaultable{
@Override
public DefImpl defaultMethod() {
return new DefImpl();
}
}
第3步
Defaultable def = new DefImpl();
def.defaultIfNull(null);
答案 5 :(得分:0)
让它像这样非静态:
public interface Defaultable {
public Defaultable default(Defaultable someOb);
}
一个类似的实现:
public Defaultable defaultIfNull(Defaultable someOb){
return (someOb != null) ? someOb :this; // Return myself if the provided is null
}
你会这样称呼它:
return new DefaultableImpl().defaultIfNull(someObject);