如何優(yōu)雅的解決空指針?
一、介紹
在實(shí)際的系統(tǒng)運(yùn)行過(guò)程中,難免會(huì)出現(xiàn)報(bào)NullPointerException空指針的錯(cuò)誤,造成這樣的本質(zhì)原因就是數(shù)據(jù)或者對(duì)象為空,導(dǎo)致程序進(jìn)一步執(zhí)行的時(shí)候報(bào)錯(cuò)!
一般的常規(guī)解決辦法也就是加一個(gè)if判斷。
- if(obj != null){
- //doSomthing
- }
如果出現(xiàn)需要判斷的對(duì)象過(guò)多,難以避免的會(huì)出現(xiàn)很多對(duì)Null的判斷語(yǔ)句,而這些語(yǔ)句一旦多起來(lái),我們的代碼就會(huì)變的慘不忍睹。
針對(duì)這種情況,我們可以引入了空對(duì)象模式以此來(lái)使我們的代碼變的更優(yōu)雅一點(diǎn)。
廢話(huà)也不多說(shuō)了,代碼直接擼起來(lái)!
二、程序示例
下面,我們以獲取從一個(gè)書(shū)籍庫(kù)中獲取書(shū)籍為例,實(shí)現(xiàn)過(guò)程如下!
先創(chuàng)建一個(gè)書(shū)籍抽象類(lèi)AbstractBook,代碼如下:
- public abstract class AbstractBook {
- //書(shū)名
- protected String bookName;
- //判斷是否存在
- public abstract boolean isExist();
- //獲取書(shū)名
- public abstract String getName();
- }
然后,創(chuàng)建一個(gè)具體實(shí)現(xiàn)類(lèi)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)建一個(gè)空對(duì)象NullObjectBook,如下:
- public class NullObjectBook extends AbstractBook {
- @Override
- public boolean isExist() {
- return true;
- }
- @Override
- public String getName() {
- return "沒(méi)有...";
- }
- }
同時(shí),創(chuàng)建一個(gè)書(shū)籍獲取工廠(chǎng)BookFactory,如下:
- public class BookFactory {
- public static final String[] names = {"java核心卷1", "java核心卷2", "軟件隨想錄", "python入門(mén)"};
- 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();
- }
- }
最后,編寫(xiě)一個(gè)測(cè)試客戶(hù)端,如下:
- public class NullObjectClient {
- public static void main(String[] args) {
- AbstractBook book1 = BookFactory.getBook("java核心卷2");
- AbstractBook book2 = BookFactory.getBook("python入門(mén)");
- 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());
- }
- }
輸出結(jié)果:
- java核心卷2
- python入門(mén)
- 沒(méi)有...
- 軟件隨想錄
從代碼上可以看出,實(shí)現(xiàn)過(guò)程比較簡(jiǎn)單!
三、應(yīng)用
空對(duì)象模式在編程中應(yīng)用也很廣,例如 google 的 guava 庫(kù)提供了Optional類(lèi),可以有效的判斷null對(duì)象。
- ptional<Integer> possible = Optional.of(5);
- possible.isPresent(); // returns true
- possible.get(); // returns 5
在 jdk1.8 中也新增了Optional類(lèi),以提高程序的健壯性!
四、總結(jié)
在寫(xiě)代碼的時(shí)候我們經(jīng)常會(huì)遇到空指針,為了避免空指針的發(fā)生需要做一些判斷。如果是復(fù)雜對(duì)象的話(huà),還需要一層層地去判斷。
巧妙的采用使用空對(duì)象模式,可以用于返回?zé)o意義的對(duì)象,從而承擔(dān)處理null的責(zé)任,提升程序員的可讀性!
五、參考
1、菜鳥(niǎo)教程 - 空對(duì)象模式