前言

整天都是在跟Java打交道。我在Java开发中最常用的一段代码就是用 != null在使用对象之前判断是否为空。这么做是为了避免NullPointerException。但是我发现这样检测代码实在是太丑了,而且及其不可读。

那有没有一种优雅的替代方法呢?

判空灾难

\"\"

作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointerException。

不过NullPointerException对于很多猿们来说,也是Exception家族中最亲近的一员了。

\"\"

为了避免NullPointerException来找我们,我们经常会进行如下操作。

if (data != null) {
 do sth.
}

如果一个类中多次使用某个对象,那你可能要一顿操作,so:

\"\"

“世界第九大奇迹”就这样诞生了。Maybe你会想,项目中肯定不止你一个人会这样一顿操作,然后按下Command+Shift+F,真相就在眼前:

\"\"

What,我们有接近一万行的代码都是在判空?

\"\"

好了,接下来,要进入正题了。

Null 模式

对于项目中无数次的判空,对代码质量整洁度产生了十分之恶劣的影响,对于这种现象,我们称之为“判空灾难”。

那么,这种现象如何治理呢,你可能听说过Null 模式,不过这不是我们今天的武器,但是还是需要介绍一下Null 模式。

什么是Null 模式呢?

In -oriented computer programming, a null is an with no referenced value or with defined neutral (\"null\") behavior. The null design pattern describes the uses of such s and their behavior (or lack thereof).

以上解析来自Wikipedia。

Null 模式首次发表在“ 程序设计模式语言 ”系列丛书中。一般的,在面向对象语言中,对对象的调用前需要使用判空检查,来判断这些对象是否为空,因为在空引用上无法调用所需方法。

空对象模式的一种典型实现方式如下图所示(图片来自网络):

\"\"

示例代码如下(命名来自网络,哈哈到底是有多懒):

Nullable是空对象的相关操作接口,用于确定对象是否为空,因为在空对象模式中,对象为空会被包装成一个 ,成为Null ,该对象会对原有对象的所有方法进行空实现。。

public interface Nullable {
 
 boolean isNull();
 
}

这个接口定义了业务对象的行为。

public interface Dependency  extends Nullable {

 void Operation();

}

这是该对象的真实类,实现了业务行为接口Dependency 与空对象操作接口Nullable。

public class Dependency implements Dependency , Nullable {

 @Override
 public void Operation() {
  System.out.print(\"Test!\");
 }

 @Override
 public boolean isNull() {
  return false;
 }
 
}

这是空对象,对原有对象的行为进行了空实现。

public class Null  implements Dependency {

 @Override
 public void Operation() {
  // do nothing
 }

 @Override
 public boolean isNull() {
  return true;
 }
 
}

在使用时,可以通过工厂调用方式来进行空对象的调用,也可以通过其他如反射的方式对对象进行调用(一般多耗时几毫秒)在此不进行详细叙述。

public class Factory {
 
 public static Dependency  get(Nullable dependency ){
  if (dependency  == null){
   return new Null ();
  }
  return new Dependency();
 }
 
}

这是一个使用范例,通过这种模式,我们不再需要进行对象的判空操作,而是可以直接使用对象,也不必担心NPE(NullPointerException)的问题。

public class Client {

 public void test(Dependency  dependency ){
  Factory.get(dependency ).Operation();
 }

}

关于空对象模式,更具体的内容大家也可以多找一找资料,上述只是对Null 的简单介绍,但是,今天我要推荐的是一款协助判空的插件NR Null ,让我们来优雅地进行判空,不再进行一顿操作来定义繁琐的空对象接口与空独享实现类。

.NR Null

NR Null 是一款适用于Android Studio、IntelliJ IDEA、PhpStorm、WebStorm、PyCharm、RubyMine、AppCode、CLion、GoLand、DataGrip等IDEA的Intellij插件。其可以根据现有对象,便捷快速生成其空对象模式需要的组成成分,其包含功能如下:

  • 分析所选类可声明为接口的方法;
  • 抽象出公有接口;
  • 创建空对象,自动实现公有接口;
  • 对部分函数进行可为空声明;
  • 可追加函数进行再次生成;
  • 自动的函数命名规范

让我们来看一个使用范例:

\"\"

怎么样,看起来是不是非常快速便捷,只需要在原有需要进行多次判空的对象中,邮件弹出菜单,选择Generate,并选择NR Null 即可自动生成相应的空对象组件。

那么如何来获得这款插件呢?

安装方式

可以直接通过IDEA的Preferences中的Plugins仓库进行安装。

选择 Preferences → Plugins → Browse repositories

\"\"

搜索“NR Null Oject”或者“Null Oject”进行模糊查询,点击右侧的Install,restart IDEA即可。

\"\"

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

收藏 打印