空判断灾难作为搬砖党一族的我们,对于空判断想必是非常熟悉的。别告诉我你很少做null判断,除非你喜欢NullPointerException。不过,对于很多猿来说,NullPointerException也是Exception家族中最亲近的成员。为了避免NullPointerException找上门来,我们经常会进行如下操作。if(data!=null){dosth.}如果一个对象在一个类中被多次使用,那么你可能要休息一下,于是:“世界第九大奇迹”就这样诞生了。也许你会想,项目中肯定不是你一个人会做这样的操作,然后按下Command+Shift+F,真相就摆在你面前:什么,我们有将近10000行代码是都是空的?好了,接下来,进入正题。NullObject模式对项目中无数的空判断对代码质量和整洁度的影响非常不好。对于这种现象,我们称之为“空判断灾难”。那么,如何处理这种现象,大家可能听说过NullObject模式,但这不是我们今天的利器,但还是要介绍一下NullObject模式。什么是NullObject模式?在面向对象的计算机编程中,空对象是没有引用值或具有定义的中性(“空”)行为的对象。空对象设计模式描述了此类对象的用途及其行为(或缺乏行为)。以上分析来自维基百科。NullObject模式最早发表于“ProgrammingPatternLanguages”系列丛书中。通常,在面向对象的语言中,在调用对象之前需要使用空检查来确定这些对象是否为空,因为不能在空引用上调用所需的方法。null对象模式的一个典型实现如下图(图片来自网络):示例代码如下(名字来自网络,哈哈偷懒):Nullable是相关的空对象的操作接口,用于判断对象是否为Null,因为在null对象模式下,对象为null会被包装成一个Object,成为一个NullObject,会实现所有的方法原始对象的...publicinterfaceNullable{booleanisNull();}此接口定义业务对象的行为。publicinterfaceDependencyBaseextendsNullable{voidOperation();}这是对象的真正类,实现??了业务行为接口DependencyBase和空对象操作接口Nullable。publicclassDependencyimplementsDependencyBase,Nullable{@OverridepublicvoidOperation(){System.out.print("Test!");}@OverridepublicbooleanisNull(){returnfalse;}}这是一个空对象,实现了原对象的行为。publicclassNullObjectimplementsDependencyBase{@OverridepublicvoidOperation(){//donothing}@OverridepublicbooleanisNull(){returntrue;}}在使用的??时候,可以通过调用工厂来调用null对象,也可以通过反射等其他方式调用对象(一般为几毫秒more)此处不再详述。publicclassFactory{publicstaticDependencyBaseget(NullabledependencyBase){if(dependencyBase==null){returnnewNullObject();}returnnewDependency();}}这是一个用法示例。通过这种模式,我们不再需要对对象进行空判断操作,而是可以直接使用对象而不必担心NPE(NullPointerException)。publicclassClient{publicvoidtest(DependencyBasedependencyBase){Factory.get(dependencyBase).Operation();}}关于nullobject模式,大家也可以找到更具体的内容。以上只是对NullObject的简单介绍,但是今天我要给大家推荐的是一款辅助判断null的插件NRNullObject。让我们优雅的判断null,不再需要通过单一的操作去定义繁琐的null对象接口和专属的null实现类。.NRNullObjectNRNullObject是AndroidStudio、IntelliJIDEA、PhpStorm、WebStorm、PyCharm、RubyMine、AppCode、CLion、GoLand、DataGrip和其他IDEA的Intellij插件。它可以方便快捷地根据已有对象生成空对象模式所需的组件,其作用如下:分析所选类可以声明为接口的方法;抽象公共接口;创建一个空对象并自动实现公共接口;某些函数可以声明为可空;可以添加功能重新生成;automaticfunctionnamingconvention先看一个使用例子:怎么样,是不是看起来很快捷方便,只需要进行多次空判断在object,mail弹出菜单中,选择Generate,选择NRNullObject即可自动生成相应的空对象组件。那么如何获取这个插件呢?安装方式可以直接通过IDEA的Preferences中的Plugins仓库安装。选择Preferences→Plugins→Browserepositories搜索“NRNullOject”或“NullOject”进行模糊查询,点击右侧Install,重启IDEA。Optional另一种方式是利用Java8特性中的Optional来优雅判断空位。Optional来自官方介绍如下:Acontainerobjectwhichmayormaynotcontainingannon-nullvalue.如果存在一个值,isPresent()将返回true,而get()将返回该值。可能包含也可能不包含非空值的容器对象。如果该值存在,isPresent()将返回true,而get()将返回该值。话不多说,我举个例子。有如下代码,需要获取Test2中的Info信息,但是参数是Test4,我们需要逐层申请,每层获取的对象可能为空,最终代码如下所示。publicStringtestSimple(Test4test){if(test==null){return"";}if(test.getTest3()==null){return"";}if(test.getTest3().getTest2()==null){return"";}if(test.getTest3().getTest2().getInfo()==null){return"";}returntest.getTest3().getTest2().getInfo();}但是在使用Optional之后,整个事情都不一样了。publicStringtestOptional(Testtest){returnOptional.ofNullable(test).flatMap(Test::getTest3).flatMap(Test3::getTest2).map(Test2::getInfo).orElse("");}1,Optional.ofNullable(test),如果test为空,返回一个单例的空Optional对象,如果不为空,返回一个Optionalwrapper对象,Optionalwrapstest;publicstatic
