Java

一、介绍

在实际的系统运行过程中,难免会出现报NullPointerException空指针的错误,造成这样的本质原因就是数据或者对象为空,导致程序进一步执行的时候报错!
一般的常规解决办法也就是加一个if判断。

  1. if(obj != null){
  2. //doSomthing
  3. }

如果出现需要判断的对象过多,难以避免的会出现很多对Null的判断语句,而这些语句一旦多起来,代码就会变的惨不忍睹。
针对这种情况,可以引入了空对象模式以此来使代码变的更优雅一点。

二、程序示例

下面,以获取从一个书籍库中获取书籍为例,实现过程如下!
先创建一个书籍抽象类AbstractBook,代码如下:

  1. public abstract class AbstractBook {
  2. //书名
  3. protected String bookName;
  4. //判断是否存在
  5. public abstract boolean isExist();
  6. //获取书名
  7. public abstract String getName();
  8. }

然后,创建一个具体实现类Book,如下:

  1. public class Book extends AbstractBook {
  2. public Book(String bookName) {
  3. this.bookName = bookName;
  4. }
  5. @Override
  6. public boolean isExist() {
  7. return false;
  8. }
  9. @Override
  10. public String getName() {
  11. return bookName;
  12. }
  13. }

接着,创建一个空对象NullObjectBook,如下:

  1. public class NullObjectBook extends AbstractBook {
  2. @Override
  3. public boolean isExist() {
  4. return true;
  5. }
  6. @Override
  7. public String getName() {
  8. return "没有...";
  9. }
  10. }

同时,创建一个书籍获取工厂BookFactory,如下:

  1. public class BookFactory {
  2. public static final String[] names = {"java核心卷1", "java核心卷2", "软件随想录", "python入门"};
  3. public static AbstractBook getBook(String bookName){
  4. for (int i = 0; i < names.length; i++) {
  5. if(names[i].equals(bookName)){
  6. return new Book(bookName);
  7. }
  8. }
  9. return new NullObjectBook();
  10. }
  11. }

最后,编写一个测试客户端,如下:

  1. public class NullObjectClient {
  2. public static void main(String[] args) {
  3. AbstractBook book1 = BookFactory.getBook("java核心卷2");
  4. AbstractBook book2 = BookFactory.getBook("python入门");
  5. AbstractBook book3 = BookFactory.getBook("java编程思想");
  6. AbstractBook book4 = BookFactory.getBook("软件随想录");
  7. System.out.println(book1.getName());
  8. System.out.println(book2.getName());
  9. System.out.println(book3.getName());
  10. System.out.println(book4.getName());
  11. }
  12. }

输出结果:

  1. java核心卷2
  2. python入门
  3. 没有...
  4. 软件随想录

从代码上可以看出,实现过程比较简单!

三、应用

空对象模式在编程中应用也很广,例如 google 的 guava 库提供了Optional类,可以有效的判断null对象。

  1. Optional<Integer> possible = Optional.of(5);
  2. possible.isPresent(); // returns true
  3. possible.get(); // returns 5

在 jdk1.8 中也新增了Optional类,以提高程序的健壮性!

四、总结

在写代码的时候经常会遇到空指针,为了避免空指针的发生需要做一些判断。如果是复杂对象的话,还需要一层层地去判断。
巧妙的采用使用空对象模式,可以用于返回无意义的对象,从而承担处理null的责任,提升程序员的可读性!