1. 程式人生 > >在Java中如何優雅地判空

在Java中如何優雅地判空

判空災難

NullPointerException

  作為搬磚黨的一族們,我們對判空一定再熟悉不過了,不要跟我說你很少進行判空,除非你喜歡NullPointerException。

  不過NullPointerException對於很多猿們來說,也是Exception家族中最親近的一員了。

Wowo

  為了避免NullPointerException來找我們,我們經常會進行如下操作。

if (data != null) {
    do sth.
}
複製程式碼

  如果一個類中多次使用某個物件,那你可能要一頓操作,so:

1

  “世界第九大奇蹟”就這樣誕生了。Maybe你會想,專案中肯定不止你一個人會這樣一頓操作,然後按下Command+Shift+F,真相就在眼前:

2

  What,我們有接近一萬行的程式碼都是在判空?

3

  好了,接下來,要進入正題了。

NullObject模式

  對於專案中無數次的判空,對程式碼質量整潔度產生了十分之惡劣的影響,對於這種現象,我們稱之為“判空災難”。

  那麼,這種現象如何治理呢,你可能聽說過NullObject模式,不過這不是我們今天的武器,但是還是需要介紹一下NullObject模式。

  什麼是NullObject模式呢?

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

  以上解析來自Wikipedia。

  NullObject模式首次發表在“ 程式設計模式語言 ”系列叢書中。一般的,在面嚮物件語言中,對物件的呼叫前需要使用判空檢查,來判斷這些物件是否為空,因為在空引用上無法呼叫所需方法。

  空物件模式的一種典型實現方式如下圖所示:

4

  示例程式碼如下:

  Nullable是空物件的相關操作介面,用於確定物件是否為空,因為在空物件模式中,物件為空會被包裝成一個Object,成為Null Object,該物件會對原有物件的所有方法進行空實現。。

public interface Nullable {
    
    boolean
isNull()
; } 複製程式碼

  這個介面定義了業務物件的行為。

public interface DependencyBase extends Nullable {

    void Operation();

}
複製程式碼

  這是該物件的真實類,實現了業務行為介面DependencyBase與空物件操作介面Nullable。

public class Dependency implements DependencyBase, Nullable {

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

    @Override
    public boolean isNull() {
        return false;
    }
    
}
複製程式碼

  這是空物件,對原有物件的行為進行了空實現。

public class NullObject implements DependencyBase{

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

    @Override
    public boolean isNull() {
        return true;
    }
    
}
複製程式碼

  在使用時,可以通過工廠呼叫方式來進行空物件的呼叫,也可以通過其他如反射的方式對物件進行呼叫(一般多耗時幾毫秒)在此不進行詳細敘述。

public class Factory {
    
    public static DependencyBase get(Nullable dependencyBase){
        if (dependencyBase == null){
            return new NullObject();
        }
        return new Dependency();
    }
    
}
複製程式碼

  這是一個使用範例,通過這種模式,我們不再需要進行物件的判空操作,而是可以直接使用物件,也不必擔心NPE(NullPointerException)的問題。

public class Client {

    public void test(DependencyBase dependencyBase){
        Factory.get(dependencyBase).Operation();
    }

}
複製程式碼

  關於空物件模式,更具體的內容大家也可以多找一找資料,上述只是對NullObject的簡單介紹,但是,今天我要推薦的是一款協助判空的外掛NR Null Object,讓我們來優雅地進行判空,不再進行一頓操作來定義繁瑣的空物件介面與空獨享實現類。

.NR Null Object

  NR Null Object是一款適用於Android Studio、IntelliJ IDEA、PhpStorm、WebStorm、PyCharm、RubyMine、AppCode、CLion、GoLand、DataGrip等IDEA的Intellij外掛。其可以根據現有物件,便捷快速生成其空物件模式需要的組成成分,其包含功能如下:

  • 分析所選類可宣告為介面的方法;
  • 抽象出公有介面;
  • 建立空物件,自動實現公有介面;
  • 對部分函式進行可為空宣告;
  • 可追加函式進行再次生成;
  • 自動的函式命名規範

  讓我們來看一個使用範例:

5

  怎麼樣,看起來是不是非常快速便捷,只需要在原有需要進行多次判空的物件中,郵件彈出選單,選擇Generate,並選擇NR Null Object即可自動生成相應的空物件元件。

  那麼如何來獲得這款外掛呢?

安裝方式

  可以直接通過IDEA的Preferences中的Plugins倉庫進行安裝。

  選擇 Preferences → Plugins → Browse repositories

6

  搜尋“NR Null Oject”或者“Null Oject”進行模糊查詢,點選右側的Install,restart IDEA即可。

7