5

说到在 Java 中处理“null”的最佳实践(尤其是“List”返回),从实体类的 getMethod 中返回“Collections.emptyList()”是一种好习惯吗?或者我们是否应该保持实体/数据类/方法整洁,并始终返回其值(甚至是 null),然后在代码中的其他位置处理该 null,例如;

Class Reference{

private Reference reference;

@XmlElement(name = "Reference")
public List<Reference> getReference() {
    if(reference==null){
        return Collections.emptyList();
    }
    return reference;
}

public void setReference(List<Reference> reference) {
    this.reference = reference;
}
}

还是在我使用基本的 get 方法之后更好地处理那个 null?

编辑/警告:就我的场景而言,我注意到这种方法会使我的代码崩溃,我不知道为什么,当我后来打电话时;

References ref= (References) jaxbUnmarshaller.unmarshal(xmlReader)

我得到一个不受支持的操作异常,但是当我从 collections.emtpyList 中清理我的 getMethod 时工作正常。使用 @XmlElement 标记时要小心

4

5 回答 5

3

一般来说,null“empty”可以有不同的语义:null表示“它不存在”,而“empty”表示“它存在,但里面什么都没有”。

如果你的类在“不存在”和“空”之间没有语义差异,那么返回一个空集合更好:它if在所有调用者中保存一个语句,使他们的代码看起来更干净。此外,在这种情况下,我最初会设置this.referenceCollections.emptyList(),并if从 getter 中删除 an 。当然,在这种情况下,你的 setter 需要null-check 它的参数。

于 2012-11-01T12:33:26.117 回答
3

根据我的经验,在编写 Java 代码时会使用“合同式编程”或“合同式设计”(链接)。
这意味着,在您的示例中,如果您的引用不是由外部实体设置的,那么您只需返回 null。

于 2012-11-01T12:34:41.043 回答
2

返回非空集合确实是一个好习惯。它使每个来电者免于做

if (list != null) {
    for (Item i : list) {
        ...
    }
}

所以上面的代码没问题。reference但是在变量中禁止任何空值会更好。如果您有列表的 setter,则在传递的列表为 null 时使其抛出异常,或者将 null 转换为空集合。这样,即使您的类中的代码也不必为引用变量为空而烦恼。

如果你需要区分空列表和空列表,可以考虑使用Guava 的Optional类,这样会更清楚。

请注意:由于您有一个列表,因此应命名变量references(使用 final s),访问器应命名为getReferencesand setReferences

于 2012-11-01T12:33:59.097 回答
1

一般来说:取决于(如果您需要能够区分缺失列表和空列表)。

在 XML 访问库的​​情况下,似乎有一个约定总是返回一个可变列表,以便您可以通过它更新实体。至少这是所有自动生成的 WS-* 代码所做的。

例如,要添加一个参考,你会做

x.getReferences().add(someReference);

如果您返回 null,这将导致异常。

OTOH,该约定没有或不需要参考列表的设置器(您只需清除列表并添加所有内容,而不是设置新列表)。

于 2012-11-01T12:33:42.253 回答
1
private Reference reference = Collections.emptyList();

public List<Reference> getReference() {
    return reference;
}

public void setReference(List<Reference> reference) {
    if(reference==null) 
        reference = Collections.emptyList();
    this.reference = reference;
}
于 2012-11-01T17:12:49.190 回答