半通用检查是否为空,用Java中的默认函数替换

时间:2013-04-19 15:12:52

标签: java generics

我正在寻找一种方法来制作此操作的通用函数:

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

除非最后一个函数调用失败,因为我们需要具体类的静态方法,而不是接口。

有解决方法吗?

6 个答案:

答案 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);