一、介绍
在实际的系统运行过程中,难免会出现报NullPointerException
空指针的错误,造成这样的本质原因就是数据或者对象为空,导致程序进一步执行的时候报错!
一般的常规解决办法也就是加一个if
判断。
if(obj != null){ //doSomthing }
如果出现需要判断的对象过多,难以避免的会出现很多对Null
的判断语句,而这些语句一旦多起来,我们的代码就会变的惨不忍睹。
针对这种情况,我们可以引入了空对象模式以此来使我们的代码变的更优雅一点。
废话也不多说了,代码直接撸起来!
二、程序示例
下面,我们以获取从一个书籍库中获取书籍为例,实现过程如下!
先创建一个书籍抽象类AbstractBook
,代码如下:
public abstract class AbstractBook { //书名 protected String bookName; //判断是否存在 public abstract boolean isExist(); //获取书名 public abstract String getName(); }
然后,创建一个具体实现类Book
,如下:
public class Book extends AbstractBook { public Book(String bookName) { this.bookName = bookName; } @Override public boolean isExist() { return false; } @Override public String getName() { return bookName; } }
接着,创建一个空对象NullObjectBook
,如下:
public class NullObjectBook extends AbstractBook { @Override public boolean isExist() { return true; } @Override public String getName() { return "没有..."; } }
同时,创建一个书籍获取工厂BookFactory
,如下:
public class BookFactory { public static final String[] names = {"java核心卷1", "java核心卷2", "软件随想录", "python入门"}; public static AbstractBook getBook(String bookName){ for (int i = 0; i < names.length; i++) { if(names[i].equals(bookName)){ return new Book(bookName); } } return new NullObjectBook(); } }
最后,编写一个测试客户端,如下:
public class NullObjectClient { public static void main(String[] args) { AbstractBook book1 = BookFactory.getBook("java核心卷2"); AbstractBook book2 = BookFactory.getBook("python入门"); AbstractBook book3 = BookFactory.getBook("java编程思想"); AbstractBook book4 = BookFactory.getBook("软件随想录"); System.out.println(book1.getName()); System.out.println(book2.getName()); System.out.println(book3.getName()); System.out.println(book4.getName()); } }
输出结果:
java核心卷2 python入门 没有... 软件随想录
从代码上可以看出,实现过程比较简单!
三、应用
空对象模式在编程中应用也很广,例如 google 的 guava 库提供了Optional类,可以有效的判断null对象。
Optional<Integer> possible = Optional.of(5); possible.isPresent(); // returns true possible.get(); // returns 5
在 jdk1.8 中也新增了Optional类,以提高程序的健壮性!
四、总结
在写代码的时候我们经常会遇到空指针,为了避免空指针的发生需要做一些判断。如果是复杂对象的话,还需要一层层地去判断。
巧妙的采用使用空对象模式,可以用于返回无意义的对象,从而承担处理null
的责任,提升程序员的可读性!