`
zhang_xzhi_xjtu
  • 浏览: 538417 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

实践中的重构15_null的意义和集合类作为方法结果类型

阅读更多
在编程中,估计null应该是一个很常写的词汇了。
实践中,经常看到大量类似user!=null或者userList!=null的检测。当然,这么做是为了防止NullPointerException。问题是,null这么常见,它究竟是什么意思。
观察如下一段code:
		String userName = "allen";
		User user = userService.findUserByName(userName);

如果这里user==null的话,一般的看法应该是userService没有找到指定名字的User对象。
那么这个时候null的含义就是没有找到指定名字对应的User对象。
且慢,这段code也可以如下:
		String userName = "allen";
		String userId = "2011";
		// 这里的null代表该时刻user对象没有初始化。
		User user = null;
		// 这里的null代表该时刻userService没有找到对应指定名字的User对象。
		user = userService.findUserByName(userName);
		if (user == null) {
			// 如果这里为null,则表示userService没有找到对应指定id的User对象。
			user = userService.findUserById(userId);
		}


三处都是null,但是含义是各不相同的。当方法调用返回的时候,本来应该是一个有效的User对象,但是因为找不到满足条件的结果,只能返回一个null了事。
于是就有了这个意义混淆的问题,是因为java对于简单对象没有办法区分是没有初始化还是调用了方法返回了null。
但是,集合类对这个概念的混淆有着天生的抵抗力。
当一个集合类没有初始化的时候,用null。
当一个方法找不到满足条件的对象时,返回一个空的集合。
推论就是,大部分情况下,以集合类作为返回结果类型的方法应该返回非null的对象。另,方法接口保证不返回null对于调用方代码的编写也是有好处的,参见平铺直叙的代码小节。
分享到:
评论
2 楼 zhang_xzhi_xjtu 2011-01-12  
呵呵,这个的确没有什么好的办法。
billion dollar mistake,这个很贴切,当然,还有程序员写a!=null的时间,这个时间加起来不知道有多长了。
1 楼 liusong1111 2011-01-12  
也只能如此了。
引用
Tony Hoare, who introduced the concept of null in 1965, called his “billion dollar mistake”

引用
In Java, null is a keyword, not an object, and thus it’s illegal to call any methods on it. But this is a confusing choice on the language designer’s part. Why return a keyword when the programmer expects an object?

相关推荐

    31天重构指南--代码重构(refactoring)

    无论是通过封装集合来保护内部数据结构不受外界干扰,还是通过移动方法来优化类的设计,都是重构实践中的常见策略。在实际项目开发中,开发者应该根据具体情况灵活应用这些重构技巧,不断优化代码结构,提高软件产品...

    重构:改善既有代码的设计

    2. **封装变化点**:例如`Encapsulate Field`(封装字段)、`Encapsulate Collection`(封装集合)等,这些方法有助于隔离代码中不稳定的部分,降低代码间的耦合度。 3. **提取组件**:包括`Extract Method`(提取...

    31天重构学习笔记中文版

    通过对以上案例的学习,我们不仅了解了重构的基本原则和实践方法,还深入探讨了如何通过具体的编码技巧来提高代码质量和系统的整体性能。这些知识对于每一位软件工程师而言都是非常宝贵的,无论是初学者还是资深...

    重构36计.docx

    重构是软件开发中的一种重要实践,旨在改善代码的结构,提高可读性和可维护性,同时保持原有功能。以下是对给定文档中提及的重构策略的详细解释: ### 参数列表对象化 当一个函数或方法的参数过多时,可以考虑创建...

    重构-改善既有代码的设计(中文版)

    ### 重构——改善既有代码的设计 #### 知识点概览 **重构**是指在不改变软件外部行为的前提下,对代码进行结构上的调整,以提高其可读性、可...通过不断实践和学习,重构可以成为软件开发过程中不可或缺的一部分。

    《重构——改善既有代码的设计》

    通过遵循这些原则,并运用本书中提到的各种重构方法,开发者可以有效地改善既有代码的设计,提高软件的整体质量和性能。重构是一项需要不断练习和学习的技能,对于任何希望提高自身编程水平的开发者来说都是必不可少...

    提高你c#的50各方法

    在C#编程语言的世界里,提升技能和效率是每个开发者的目标。"提高你C#的50个方法"这个主题涵盖...在实践中,你可以通过阅读"Effective.C.Sharp.chm"这样的资源,系统地学习和掌握这些技巧,进一步提升你的C#编程能力。

    jdk1.8_API中文帮助文档

    5. **Date和Time API的改进**:JDK 1.8对日期和时间API进行了全面重构,引入了`java.time`包,包含`LocalDate`、`LocalTime`、`LocalDateTime`等类,提供了更强大、更易用的日期和时间处理功能。 6. **Optional类**...

    学习通过Kotlin语言来简单地开发android应用.

    在Kotlin中,类可以定义属性、构造函数和方法。函数可以带有参数,具有返回值,并可以是成员函数或扩展函数。继承是面向对象编程的一个重要概念,它允许创建一个类(子类)继承另一个类(父类)的属性和方法。 变量...

    jdk 8 chm中文 api文档

    Lambda可以作为方法参数,或者存储在变量中,尤其在处理集合和流操作时非常方便。 2. **函数式接口** 函数式接口是指只有一个抽象方法的接口,例如`Runnable`和`Callable`。Java 8引入了`Supplier`、`Consumer`、`...

    kotlin官方参考文_中文版 pdf

    2. **枚举类**:Kotlin的枚举类可以有方法和属性,可以作为类型安全的常量。 3. **密封类**:用于表示有限的固定数量的类实例,常用于switch语句的替代。 ### 四、集合与泛型 1. **集合**:Kotlin提供了List、Set...

    提高C#编程水平的50个要点

    3. **泛型**:了解并使用泛型类、接口和方法,可以实现类型安全的数据容器,提高代码复用性。 4. **LINQ**:学习Language Integrated Query(语言集成查询)以简化数据访问,提高代码可读性。 5. **异步编程**:...

    C#开发和使用中的23个技巧

    23. **学习并实践代码重构**:通过重构提升代码可读性和维护性,如提取方法、替换魔术字符串等。 这些技巧覆盖了C#编程的基础到高级概念,无论是初学者还是经验丰富的开发者,都能从中受益。通过不断学习和实践,你...

    第一课 TypeScript基础实用课程介绍1

    4. **Class(类)**:TypeScript支持面向对象编程,引入了类的概念,可以进行继承、抽象方法和访问修饰符等操作。 5. **枚举(Enums)**:枚举是一种定义常量集合的类型,用于表示有限的、离散的值。 6. **泛型...

    JDK api1.8 中文版

    10. **新的集合工厂方法**:在集合类如List、Set和Map中添加了新的工厂方法,可以直接创建预定义大小的集合实例。 使用《JDK API 1.8 中文版》时,开发者可以快速查找和理解类、接口、枚举和注解的详细信息,包括...

    C# 编程注意项

    11. **集合与泛型**:了解各种集合类如`List<T>`、`Dictionary, TValue>`,以及泛型的优势和使用场景。 12. **接口**:使用接口定义行为规范,实现多态性,提高代码的灵活性。 13. **抽象类**:抽象类用于提供部分...

    改善C#程度的50种方法

    在C#编程中,提升技能和优化代码是每个开发者不断追求的目标。...以上50个方法涵盖了C#编程中的许多核心概念和技术,通过学习和实践,你可以显著提升自己的C#编程技能,编写出更高效、更可靠、更易于维护的代码。

    java JDK 8学习笔记

    8. **新的集合工厂方法**:在`List`、`Set`和`Map`接口中添加了新的工厂方法,如`of()`和`ofNullable()`,可以方便地创建不可变集合。 9. **并行流(Parallel Streams)**:Stream API支持并行处理,可以充分利用...

Global site tag (gtag.js) - Google Analytics