如何優(yōu)雅的解決空指針?
一、介紹
在實際的系統(tǒng)運行過程中,難免會出現報NullPointerException空指針的錯誤,造成這樣的本質原因就是數據或者對象為空,導致程序進一步執(zhí)行的時候報錯!
一般的常規(guī)解決辦法也就是加一個if判斷。
- if(obj != null){
- //doSomthing
- }
如果出現需要判斷的對象過多,難以避免的會出現很多對Null的判斷語句,而這些語句一旦多起來,我們的代碼就會變的慘不忍睹。
針對這種情況,我們可以引入了空對象模式以此來使我們的代碼變的更優(yōu)雅一點。
廢話也不多說了,代碼直接擼起來!
二、程序示例
下面,我們以獲取從一個書籍庫中獲取書籍為例,實現過程如下!
先創(chuàng)建一個書籍抽象類AbstractBook,代碼如下:
- public abstract class AbstractBook {
- //書名
- protected String bookName;
- //判斷是否存在
- public abstract boolean isExist();
- //獲取書名
- public abstract String getName();
- }
然后,創(chuàng)建一個具體實現類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;
- }
- }
接著,創(chuàng)建一個空對象NullObjectBook,如下:
- public class NullObjectBook extends AbstractBook {
- @Override
- public boolean isExist() {
- return true;
- }
- @Override
- public String getName() {
- return "沒有...";
- }
- }
同時,創(chuàng)建一個書籍獲取工廠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對象。
- ptional<Integer> possible = Optional.of(5);
- possible.isPresent(); // returns true
- possible.get(); // returns 5
在 jdk1.8 中也新增了Optional類,以提高程序的健壯性!
四、總結
在寫代碼的時候我們經常會遇到空指針,為了避免空指針的發(fā)生需要做一些判斷。如果是復雜對象的話,還需要一層層地去判斷。
巧妙的采用使用空對象模式,可以用于返回無意義的對象,從而承擔處理null的責任,提升程序員的可讀性!
五、參考
1、菜鳥教程 - 空對象模式