繁体   English   中英

Java:null的默认值object更好

[英]Java: null of default value of object is better

第一种情况:有一个 class 有另一个 class 作为其数据成员。 当这个 class 被实例化时,我们应该如何处理数据成员?

  • (A) 在构造函数中:this.anotherClass = new AnotherClass();
  • (B) 留下null,不需要实例化它。

第二种情况:有一个 class 有一个 ArrayList 作为其数据成员。 当这个 class 被实例化时,我们应该如何处理 ArrayList?

  • (A) 在构造函数中:this.bulidingList = new ArrayList< Building >();
  • (B) 留下null,不需要实例化它。

第三种情况:当我们创建一个返回类型为集合的方法时,例如

public ArrayList< Building > getBuildingList(){ /// Bah Bah Bah.. }

如果没有建筑物,我们应该返回空的 ArrayList " new ArrayList< Building >() " "或null

我宁愿不使用 null 来避免潜在的NullPointerException 为了避免创建不必要的对象,您可以构造一个 static 实例来返回,只要它是不可变的。 至于空的ArrayList ,您可以使用Collections.emptyList()为您执行此操作。

最后,如何定义 API 的工作方式取决于您。 无论哪种方式,您都应该清楚地记录它,以便调用者知道会发生什么。

你有什么需求? 我的一般偏好是尽可能返回 null,因为这样可以避免在 memory 中创建另一个 object。

如果您确保文档清楚地说明该方法可能返回 null 并且它是调用代码来处理它的责任,我认为没有问题。

没有具体的答案。 这是您的 API 的情况,或者更简单地说,是包围代码的期望。

尝试详细考虑您的 getBuildingList()。 可以退货 null 吗? 或者 null 被禁止,你应该返回空列表?

无论如何,请在 javadoc 中记录您对该方法的想法。

鉴于 Java 中 Null 的破坏性,我认为返回空 collections 而不是 null116B9ABFE6EB17CCA22collections 是一个好习惯。

对于对象,如果 object 内部没有设置值,则应返回“null”。

默认初始化的 object 是否有意义,就像空的 ArrayList 一样? 然后实例化它。 不要过早优化。

另一方面,如果默认的AnotherClass没有意义,则将成员保留为 null。

最后,如果遇到性能或 memory 使用问题,请考虑修改设计。

在我看来,如果有更好的选择,最好设计您的 API 以避免返回null

  • 对于 collections,返回一个空集合; 例如Collections.emptyList()new ArrayList() ...取决于 API 要求。
  • 对于 arrays,返回长度为零的数组。
  • 对于对象,考虑是否可以使用 class 的区分实例,或者设计 API 使得结果首先不能是null

如果您确实需要返回null ,或接受null作为方法参数,请确保 javadoc 明确指出这是一个有效的结果/参数......以及它的含义


使用null的 API 的问题是开发人员忘记null情况,结果是意外的NullPointerException 您可以说这不是 API 设计者的错 - API 用户应该阅读过文档。 但这并不能真正解决问题。 更好的方法是首先避免返回null ,尤其是在有简单替代方案的情况下。

另一点是调用者通常更容易处理非空值。 null通常必须由调用代码作为特殊情况处理。 非空值不会。 例如,您可以使用for循环遍历空集合或数组,但必须显式测试null

第三种情况:当我们创建一个返回类型为集合的方法时,例如

public ArrayList< Building > getBuildingList(){ /// Bah Bah Bah.. }

这太糟糕了,公共成员永远不应该返回实现类型。 签名应该是:

public List< Building > getBuildingList()

这样,如果您的数据为空,您可以(并且应该)返回Collections.emptyList()

第一种情况:有一个 class 有另一个 class 作为其数据成员。 当这个 class 被实例化时,我们应该如何处理数据成员?

(A) 在构造函数中:this.anotherClass = new AnotherClass();

(B) 留下null,不需要实例化它。

我更喜欢 (C) 在构造函数中:需要一个非空的AnotherClass参数。

如果您需要一个默认构造函数并且您总是希望调用者在之后也调用setAnotherClass()您可以将它留在构造函数中null并在您实际使用该字段时检查 null ,否则您可能应该在构造函数中创建默认的AnotherClass ZA8CFDE6331BD59EB62AC96B .

第二种情况:有一个 class 有一个 ArrayList 作为其数据成员。 当这个 class 被实例化时,我们应该如何处理 ArrayList?

(A) 在构造函数中:this.bulidingList = new ArrayList< Building >(); (B) 留下null,不需要实例化它。

我总是会实例化它,但如果列表是只读的,我会这样声明它:

List<Building> buildingList = Collections.emptyList();

第三种情况:当我们创建一个返回类型为集合的方法时,例如

public ArrayList< Building > getBuildingList(){ /// Bah Bah Bah.. }

如果没有建筑物,我们应该返回空的 ArrayList "new ArrayList< Building >()" "或 null。

我对此并不特别自豪,但是当我想要一个额外的返回值时,我有时会返回null ,比如getBuildingsListAndReturnNullIfThereAreNoTenants 当您只想说“我没有找到任何建筑物”时,最好返回一个空列表。

有时您可以进行前期检查并返回Collections.emptyList()而不是创建新的ArrayList<Building>实例,但我不会 go 这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM