编码 | 并非Null Object这么简单

在大多数程序语言中,我们都需要与Null打交道,并且纠缠于对它的检查中。一不小心让它给溜出来,就可能像打开潘多拉的盒子一般,给程序世界带来灾难。说起来,在我们人类世界中,Null到底算什么“东西”呢?语义上讲,它就是一场空,即所谓“虚无”。这个世界并没有任何物质可以代表“虚无”,因而它仅存于我们的精神层面。说虚无存在其实是一种悖论,因为存在其实是虚无的反面。若从程序本质上讲,Null代表一种状态,指一个对象(或变量),虽获声明却未真正诞生,甚至可能永远不会诞生。而一旦诞生,Null就被抹去了,回归了正确的状态。

站在OO的角度来讲,既然Everything is object,自然可以将Null同样视为Object——这近似于前面提到的悖论,既然是Null,为何又是Object呢?换言之,在对象世界里,其实没有什么不存在,所谓“不存在”仍然是一种“存在”。这么说容易让人变糊涂,就好像我们搞不清楚“我是谁”。所以,我宁肯采用Martin Fowler的说法,将Null Object视为一种Special Case,即Null其实是一种特例。

视Null为一种特例,即可用OO的特化来表达。当某个对象可能存在Null这种状态时,都可以将这种状态表示为一种特化的类,它不再代表Null,而是代表“什么都不做”。凡是返回Null的地方,都替换为这个Null Object,用以表达这种Null其实仅仅是一种特列。于是乎,我们像抹杀异教徒一般抹去了“虚无”的存在。(当虚无被抹去,是什么样的存在?)

然而,若在程序语言中实现自己的Null Object,固然可以在一定程度上消除对Null的检查,却存在一些约束:

  • 对于String之类的类型,无法定义NullString子类;
  • 每次都需要自己去定义子类来表示Null;
  • 必须约束团队不能返回Null;

原文发布于微信公众号 - 逸言(YiYan_OneWord)

原文发表时间:2015-01-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

面向对象的初步理解连载 7

面向对象是一种主流的编程思维,其核心是把现实世界中的对象,对象之间的关系模拟到程序世界中,构造一个软件系统。 Java 是一种典型的面向对象编程语言。这篇文章主...

1979
来自专栏数说工作室

循环、分支...都可以在Python中用函数实现! | 函数式编程,打开另一个世界的大门

编程界有一位传奇人物——王垠,介绍一下他的退学经历,对,你没听错,退!学!经!历!: 2006年,从清华大学计算机系退学,在水木社区BLOG上发表了《清华梦的...

2816
来自专栏数据结构与算法

P1538 迎春舞会之数字舞蹈

题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会。 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列。 为了配合每...

2827
来自专栏怀英的自我修炼

怀英漫谈2-JS语法初涉

今天碰了一下JS的语法,想与你聊聊这个。这篇文章适合前端设计师,不过在文末,我也为你准备了一些感悟,有兴趣的不妨跳到最后一看。 总体来看,JS的语法和Java的...

35810
来自专栏我是攻城师

偏执却管用的10条Java编程技巧

3397
来自专栏非著名程序员

为什么要使用String

最近在培训课期间指导初学者。任务之一就是要大家完成一个类,要求这个类对key为String类型的map执行dwarwle操作。其中一位学员完成的类中,有如下方法...

18210
来自专栏专知

【LeetCode 14】关关的刷题日记44 – Longest Common Prefix

关关的刷题日记44 – Leetcode 14. Longest Common Prefix 题目 Write a function to find the l...

3286
来自专栏绿巨人专栏

函数式编程 : 一个程序猿进化的故事

3569
来自专栏IT 指南者专栏

Java 数据结构与算法系列之冒泡排序

相信大部分同学都已经学过数据结构与算法这门课了,并且我们可能都会发现一个现象就是我们所学过的数据结构与算法类的书籍基本都是使用 C 语言来写的,好像没见过使用 ...

1386
来自专栏数说工作室

提取文本数据,分析师小王初上手!| 【SAS Says·扩展篇】正则表达式

文本分析很有用,数说君自己也玩过,炒鸡有意思,从论坛、网页上爬取网友的舆情数据,然后整理、统计、画图,就可以知道舆论的风暴是什么,可以知道网友最热议的话题、最想...

3856

扫码关注云+社区