Java空条件

Java空条件,java,refactoring,Java,Refactoring,我的Java代码中多次出现以下模式,我想知道你们中的一些人可能会如何重构它 Object obj1 = buildObj1(); if (obj1 != null) { return obj1; } Object obj2 = buildObj2(); if (obj2 != null) { return obj2; } Object obj3 = buildObj3(); if (obj3 != null) { return obj3; } 因为Java没有一流的

我的Java代码中多次出现以下模式,我想知道你们中的一些人可能会如何重构它

Object obj1 = buildObj1();
if (obj1 != null) {
    return obj1;
}

Object obj2 = buildObj2();
if (obj2 != null) {
    return obj2;
}

Object obj3 = buildObj3();
if (obj3 != null) {
    return obj3;
}

因为Java没有一流的函数,所以最好能有一个用于“构建东西”的接口,然后执行如下操作:

for (Builder<T> builder : builders) {
    T obj = builder.build();
    if (obj != null) return obj;
}
for(生成器:生成器){
T obj=builder.build();
如果(obj!=null)返回obj;
}
生成器界面将类似于:

public interface Builder<T> {
    T build();
}
公共界面生成器{
T build();
}

顶部代码段中的
builders
是一个
Iterable

是否所有代码都是以相同的方法顺序调用的?可以使用始终返回正确对象(obj1、obj2或obj3)的。您可以将每个
buildObj()
方法中的“null或real object”条件测试拉入此工厂方法,以便始终从新工厂方法中获取有效对象


另一方面,如果你只是说你有<代码>如果(Obj.nnull)< /C> >到处测试,你可以考虑使用null对象模式:

与其使用空引用来表示对象的缺失(例如,不存在的客户),不如使用实现预期接口但其方法体为空的对象。与正常工作的默认实现相比,这种方法的优点是空对象是非常可预测的,并且没有副作用:它什么都不做


else的逻辑是什么?抛出一个异常?在最底层,它返回null;总是返回一个对象吗?@Allain-我只是对代码做了一个小的修改,假设它看起来不正确。如果我错了,请随时回复。:)是上面的代码在一个方法中,还是你只是在演示重复。我忘了点击提交。这就是我的解决方案!如果方法的确切顺序相同,您可能还需要编写某种管理类来处理生成器。@Stefan Kendall-让我发笑。您是将这些生成器放在类内部,还是将其升级为顶级类?生成器界面非常通用,所以我可能会把它放在最高层的某个地方。该接口的实现是否是顶级的取决于它们的一般用途。实际上,该生成器界面与Google Collections()中的供应商界面非常相似。很多人想看看供应商如何在谷歌集合中使用,甚至可能考虑使用它。