`
javawebsoa
  • 浏览: 424584 次
社区版块
存档分类
最新评论

Java学习笔记:(38)返回零长度的数组或者集合,而不是:null

 
阅读更多

让我们先举坏例子:

返回null的情况

复制代码
private final List<Cheese> cheesesInStock = ...;

public Cheese[] getCheeses() {
    if(cheesesInStock.size() == 0)
        return null;
    ...
}
复制代码

对于上面的例子,客户端程序处理时如下:

Cheese[] cheeses = shop.getCheeses();
if(Cheeses != null &&
    Arrays.asList(cheeses).contains(Cheese.STILTON))
    System.out.println("Jolly good, just the thing.");

我们可以看出,客户端程序员需要专门去判断Cheese是否为null,这让客户端代码写起来很费劲,客户端程序员也很容易忘记判断是否为null的情况。

因此,最好返回数组或者集合的个数,即使是0。

因为如果返回的是数组的个数,客户端代码就可以写得很简明,如下:

if(Arrays.asList(cheeses).contains(Cheese.STILTON))
    System.out.println("Jolly good, just the thing.");

另外,集合值也可以做成每当需要返回空集合时,都返回同一个不可变的空集合。例如:Collections.emptySet、emptyList和emptyMap。

例子如下:

public List<Cheese> getCheeseList() {
    if(cheesesInStock.isEmpty())
        return Collections.emptyList();
    else
        return new ArrayList<Cheese>(cheesesInStock);
}




这个观点来自<<Effective Java>>。

在Collections中有专门针对List,Set,Map的空的实现。如:

Collections.emptyList()

Collections.emptySet();

Collections.emptyMap();

在返回这些集合的方法中,尽量不要返回空值,避免NullPointerException。而就尽量返回非空值,这时候上面

所示的三个空(不是null)集合就有用武之地了,可以使用它们。

如在某方法中这样做:

publci List<String> getInterests(){

if(interests == null){

return Collections.emptyList();

}

return interests;

}

同理,针对需要返回数组的方法,也没必要返回空数组。可以用new int[0]之类的长度为0的数组的来替代。这样也可以避免返回空值。

分享到:
评论

相关推荐

    Java编程思修第4版本学习笔记(下).pdf

    以上知识点是基于【标题】中的"Java编程思修第4版本学习笔记(下)"以及【部分内容】中提供的信息总结得出。这些内容不仅包括了数组的定义和特性,数组与其他容器的比较,创建和初始化数组的方式,还涵盖了对数组的...

    个人java总结笔记

    ### 个人Java总结笔记 #### Class对象概述 - **概念**:`Class`对象表示一个类或接口。每个被加载的类都会对应一个唯一的`Class`对象。 - **创建时机**:`Class`对象由Java虚拟机(JVM)在需要使用到该类时自动...

    自己总结java学习笔记

    Java是一种广泛使用的面向对象的编程语言...这只是Java学习中的一小部分,深入学习还需要涵盖异常处理、集合框架、多线程、I/O流、网络编程、数据库连接等内容。不断实践和理解这些概念将有助于提升你的Java编程技能。

    Java数据结构和算法-学习笔记

    ### Java数据结构与算法——学习笔记 #### 一、引言 在计算机科学领域,**数据结构**与**算法**是两个极其重要的概念。数据结构指的是数据的组织方式,而算法则是解决特定问题的一系列步骤。这两者是编程的基础,...

    个人笔记--Java_API

    - **灵活性**:集合的大小可以动态改变,而数组一旦创建其长度就固定了。 - **类型**:集合只支持对象类型,不支持基本数据类型;数组既可以存储对象也可以存储基本数据类型。 - **操作**:集合提供了更多复杂的...

    PL/SQL学习笔记

    联合数组的索引不是连续的,只要在上面的范围内就可以 嵌套表示例代码: declare --声明嵌套表数据类型 type mytype is table of varchar2(100); --声明嵌套表变量 嵌套表必须初始化 var1 mytype:=new mytype('a'...

    java笔记.docx

    在Java中,数组的长度在声明时就必须确定,并且不可改变。 标识符是编程中用来命名变量、类、接口等的符号。它们遵循特定的命名规则:区分大小写,不能使用关键字,且True、false、null虽非关键字但也不建议用作...

    Java学习笔记-个人整理的

    {1.10.5}扩充数组对象长度}{36}{subsection.1.10.5} {1.10.6}Problems}{37}{subsection.1.10.6} {1.11}简单算法}{38}{section.1.11} {1.11.1}打乱算法}{38}{subsection.1.11.1} {1.11.2}排序算法}{38}{...

    jsp学习笔记

    ### JSP学习笔记知识点梳理 #### 一、JSP中的隐式对象 JSP提供了九个内置对象(也称为隐式对象),它们分别是:`request`、`response`、`out`、`session`、`application`、`config`、`pageContext`、`page` 和 `...

    教学笔记_201707031

    这篇教学笔记主要涵盖了Java编程语言的基础知识,包括环境配置、Eclipse IDE的使用、Java代码编写、注释、标识符与关键字、运算符、选择和循环结构,以及数组的使用。以下是对这些知识点的详细解释: 1. **Java环境...

    net学习笔记及其他代码应用

    答:string str = null 是不给他分配内存空间,而string str = \"\" 给它分配长度为空字符串的内存空间。 25.请详述在dotnet中类(class)与结构(struct)的异同? 答:Class可以被实例化,属于引用类型,是分配在内存的...

    Oracle 11g学习笔记基础篇(pdf)

    字符串数组在Oracle中的小标是从1开始的,这不同于某些编程语言如C或Java,它们是从0开始计数。 #### 数据库对象 Oracle 11g支持多种数据库对象,包括但不限于: - **表(Table)**:存储数据的基本结构。 - **视图...

    JavaScript学习笔记

    这篇学习笔记将深入探讨JavaScript的核心概念,帮助读者掌握这一强大的编程工具。 首先,从“JavaScript简介.xmind”开始,我们了解到JavaScript是由Netscape公司的Brendan Eich在1995年发明的,最初被命名为Mocha...

    高级C语言 学完C语言来看这个绝对收获

    在C++中,`new`失败时会抛出异常,而不是返回NULL。 #### 68. C是C++的子集吗? C语言不是C++的严格子集,尽管两者有很多相似之处。 #### 69. C和C++的区别是什么? C++基于C语言,但在面向对象编程、模板等方面...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

    Hibernate Validation各注解的用法

    3. **@Size**:该注解可以限制字段的长度,例如,可以指定字符串的最小和最大长度,数组或集合元素的数量等。 4. **@Min** 和 **@Max**:这两个注解用于限制数值类型的字段值在指定范围内,如年龄不能小于0或大于...

    javascript高级学习笔记整理

    Array 类型是JavaScript中的复杂类型之一,它类似于列表,可以存储任意类型的数据,通过`length`属性获取数组长度。数组方法如`push`、`pop`、`splice`等提供了丰富的操作。 此外,JavaScript的执行环境和作用域也...

    Spring学习笔记2之表单数据验证、文件上传实例代码

    - `@Size`:验证字段长度,适用于字符串、数组或集合,可以设置最小和最大长度。 - `@Past`:验证日期字段是否在当前时间之前。 - `@Digits`:验证数字字段,限制整数和小数部分的位数。 - `@Pattern`:验证字段...

Global site tag (gtag.js) - Google Analytics