Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Collections.emptyList()和null处理_Java_Null - Fatal编程技术网

Java 使用Collections.emptyList()和null处理

Java 使用Collections.emptyList()和null处理,java,null,Java,Null,说到Java中处理“null”的最佳实践(尤其是“List”返回),从实体类的getMethod返回“Collections.emptyList()”是一种好的实践吗?或者我们应该保持实体/数据类/方法整洁干净,始终返回其值(甚至是null),然后在代码中的其他地方处理该null,例如 Class Reference{ private Reference reference; @XmlElement(name = "Reference") public List<Reference&g

说到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;
}
}

我得到了一个不受支持的操作异常,但当我从collections.emtpyList中清理getMethod时,它可以正常工作。因此,在与@xmlement标记一起使用时,通常,
null
和“empty”可能具有不同的语义:
null
表示“它不在那里”,而“empty”表示“它在那里,但里面什么都没有”

如果您的类在“notthere”和“empty”之间没有语义差异,那么返回一个空集合更好:它在所有调用方中保存一个
If
语句,使它们的代码看起来更干净。此外,在本例中,我首先将
this.reference
设置为
Collections.emptyList()
,并从getter中删除
if
。当然,在这种情况下,您的setter需要
null
-检查其参数。

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

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

例如,要添加引用,您需要执行以下操作

x.getReferences().add(someReference);
如果返回null,将导致异常


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

返回非空集合确实是一种好做法。它使每个来电者都不必这样做

if (list != null) {
    for (Item i : list) {
        ...
    }
}
所以上面的代码很好。但是在
reference
变量中不允许任何空值会更好。如果有列表的setter,则如果传递的列表为null,则使其引发异常,或者将null转换为空集合。这样,即使类中的代码也不必担心引用变量为null

如果需要区分空列表和空列表,请考虑使用类,这使得事情更加明了。

请注意:因为您有一个列表,所以变量应该命名为
references
(最后加上一个s),访问器应该命名为
getReferences
setReferences
,根据我的经验,在编写Java时使用“按合同编程”或“按合同设计”。
这意味着,在您的示例中,如果您的引用不是由外部实体设置的,那么您只需返回null即可。

private reference reference=Collections.emptyList();
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;
}
公共列表getReference(){ 返回参考; } 公共无效集合引用(列表引用){ if(reference==null) reference=Collections.emptyList(); this.reference=参考; }
谢谢大家,所有好的建议,我们可以说实体类中的这种空处理方法对字符串或整数等非列表类型也有效吗?只有明确希望变量为空时,才可以使用整数而不是int。否则,使用int是更好的选择。关于字符串,null通常用于表示未设置属性,而不是空字符串。但是调用者通常不会对字符串进行迭代。就我的场景而言,这种方法会破坏我的代码,我不知道为什么,当我稍后调用(引用)jaxbUnmarshaller.unmarshal(xmlReader)时。我得到一个不受支持的操作异常,当我从collections.emtpyList中清除getMethod时,这种方法会起作用。。
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;
}