2015-06-26 83 views
4

當我編碼時,我經常將我的變量賦值爲null,以便稍後可以使用這些信息。將我的變量賦值爲null允許我指定變量的狀態是無效的,這樣做可以讓我在程序中稍後檢查該變量的有效性。但是,我的代碼靜態分析工具,比如PMD,在我將變量賦值爲null時大叫,聲明這是一種代碼異味,我應該考慮重構。將變量分配給null的最佳選擇是什麼?

所以我的問題是:當你想指定這個變量爲無效狀態時,將變量賦值爲null的最佳選擇是什麼?

+1

禁止PMD ...它不能告訴你該怎麼做! – ZhongYu

+0

檢查此:http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/base/Optional.html或它的java8模擬http://docs.oracle.com /javase/8/docs/api/java/util/Optional.html – kofemann

+0

@ProPhil你可以在PMD抱怨的地方顯示代碼片段嗎?環境在這裏很重要。 – CKing

回答

1

我最喜歡的方法之一是Null Object Pattern。這是一個正確類型的對象(非空) - 通常是所討論類型的一個子類 - 對於空行爲正確。也就是說,如果你調用一個方法,什麼都不會發生,但不像真正的null,它不會引發異常。

0

它取決於變量的類型。通常,null是所有變量的通用選項。然而,我所看到的最好的選擇是將var分配給很少/很不可能使用的東西。

例如:

字符串str = 「I AM NULL」;

Int num = MIN_INT;(我忘記了MIN_INT的實際方法調用,但想法是一樣的)。

然後你會在每種情況下檢查這些值。

-1

如果您使用該變量作爲條件目的,則應使用布爾值。

1

null的另一種替代方式是empty狀態。例如String對象可以是empty它甚至有一個方法來檢查它是否爲空String.isEmpty()。取決於你的對象,你可以有一個返回truefalse的方法,這取決於objects狀態是否爲空或不爲空。這允許你不使用nulls。您可以將您的object初始化爲empty狀態。只是谷歌空對空,你會發現很多信息。 Collections是可以返回empty對象(列表,集合,或在這種情況下地圖)又如:

Collections.emptyList() 
Collections.emptySet() 
Collections.emptyMap() 

Java Prefer Empty to Null Link

Avoid Nulls Link

之所以這麼說還是有情況null是有用。這很大程度上取決於您的編程風格和具體情況。 null可能對測試有幫助,因爲您的應用程序將與NPE一起崩潰,因此您將能夠檢測到錯誤...其中empty對象可能會導致logical錯誤,這些錯誤有時更難以檢測到。這取決於程序員決定什麼是最適合每種情況的......

如果你想有一個empty對象與isEmpty()方法,你只需要決定什麼「空」意味着在你的對象的情況。然後,您可以圍繞自定義類object的空白構建自己的規則。

2

您可以使用在Java 8中引入的可選框架。

Optional<String> str = foo() // Method that returns an optional String 
if(!str.isPresent()){ 
    // Invalid state 
}else{ 
    String validStr = str.get(); 
    // Valid state 
} 

您初始化一個可選的Optional.of(「」)

0

我所做的是對變量分配,你知道你將永遠不會使用的值。

例如我曾經給一個字符串賦值:「DELETED」,我知道它永遠不會出現。這樣它不僅可以處理PMD,還可以避免一些潛在的NullPointerException。

1

分配null的問題是null可能有幾個含義:變量(或字段)未初始化,值不存在或不適用。因此,程序員要記住(或發現)在特定情況下的空值是什麼。

替代方法是使用空對象模式或使用選項類型(請參閱Java中的可選類)。 本維基百科文章涵蓋了所有內容:https://en.wikipedia.org/wiki/Nullable_type

現在回到PMD,我認爲這取決於您的團隊是否想要遵循此規則以及您想如何修復它。

相關問題