使用Collections.emptyList()和null处理

时间:2012-11-01 12:26:28

标签: java null

说到在Java中处理“nulls”的最佳实践(特别是“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标记时要小心

5 个答案:

答案 0 :(得分:3)

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

如果您的类是“not there”和“empty”之间没有语义差异,那么返回空集合会更好:它会在所有调用者中保存if语句,从而生成代码看起来更干净此外,在这种情况下,我最初会将this.reference设置为Collections.emptyList(),并从getter中删除if。当然,在这种情况下,你的setter需要null - 检查它的论点。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

返回非null集合确实是一种好习惯。它可以避免每个调用者执行

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

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

如果您需要区分null和空列表,请考虑使用Guava's Optional类,这样可以更清楚。

请注意:由于您有一个列表,因此该变量应命名为references(最终 s ),并且访问者应命名为getReferences和{ {1}}。

答案 3 :(得分:1)

通常:依赖(如果您需要能够区分缺失列表和空列表)。

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

例如,要添加引用,您将执行

x.getReferences().add(someReference);

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

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

答案 4 :(得分: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;
}