1

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

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

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

有没有解决的办法?

4

6 回答 6

3

不,不是真的 -null作为参数传递的没有任何类型信息。您不能使用通用工厂来做到这一点,因为为此您需要手头有类型才能获得正确的工厂对象。

第三,为什么需要这种模式?

于 2013-04-19T15:18:01.563 回答
1
public static <T> T replaceIfNull(T objectToCheck, T defaultValue) {
    return objectToCheck == null ? defaultValue : objectToCheck;
}

replaceIfNull(getXdata(),BigDecimal.ZERO).add(getYdate));
于 2013-06-04T11:26:18.557 回答
0

只需从界面中删除静态。这不是必需的。

于 2013-04-19T15:20:10.293 回答
0

怎么样:

public <T> T firstNonNull(T ... vals) {
   // omitted
}

这不完全是您想要的,但更通用(并且有效)。

于 2013-04-19T15:48:57.033 回答
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);
于 2013-04-19T15:49:36.880 回答
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);
于 2013-04-19T16:05:01.613 回答