當我編碼時,我經常將我的變量賦值爲null,以便稍後可以使用這些信息。將我的變量賦值爲null允許我指定變量的狀態是無效的,這樣做可以讓我在程序中稍後檢查該變量的有效性。但是,我的代碼靜態分析工具,比如PMD,在我將變量賦值爲null時大叫,聲明這是一種代碼異味,我應該考慮重構。將變量分配給null的最佳選擇是什麼?
所以我的問題是:當你想指定這個變量爲無效狀態時,將變量賦值爲null的最佳選擇是什麼?
當我編碼時,我經常將我的變量賦值爲null,以便稍後可以使用這些信息。將我的變量賦值爲null允許我指定變量的狀態是無效的,這樣做可以讓我在程序中稍後檢查該變量的有效性。但是,我的代碼靜態分析工具,比如PMD,在我將變量賦值爲null時大叫,聲明這是一種代碼異味,我應該考慮重構。將變量分配給null的最佳選擇是什麼?
所以我的問題是:當你想指定這個變量爲無效狀態時,將變量賦值爲null的最佳選擇是什麼?
我最喜歡的方法之一是Null Object Pattern。這是一個正確類型的對象(非空) - 通常是所討論類型的一個子類 - 對於空行爲正確。也就是說,如果你調用一個方法,什麼都不會發生,但不像真正的null,它不會引發異常。
它取決於變量的類型。通常,null是所有變量的通用選項。然而,我所看到的最好的選擇是將var分配給很少/很不可能使用的東西。
例如:
字符串str = 「I AM NULL」;
Int num = MIN_INT;(我忘記了MIN_INT的實際方法調用,但想法是一樣的)。
然後你會在每種情況下檢查這些值。
如果您使用該變量作爲條件目的,則應使用布爾值。
null
的另一種替代方式是empty
狀態。例如String
對象可以是empty
它甚至有一個方法來檢查它是否爲空String.isEmpty()
。取決於你的對象,你可以有一個返回true
或false
的方法,這取決於objects
狀態是否爲空或不爲空。這允許你不使用nulls
。您可以將您的object
初始化爲empty
狀態。只是谷歌空對空,你會發現很多信息。 Collections
是可以返回empty
對象(列表,集合,或在這種情況下地圖)又如:
Collections.emptyList()
Collections.emptySet()
Collections.emptyMap()
Java Prefer Empty to Null Link
之所以這麼說還是有情況null
是有用。這很大程度上取決於您的編程風格和具體情況。 null
可能對測試有幫助,因爲您的應用程序將與NPE
一起崩潰,因此您將能夠檢測到錯誤...其中empty
對象可能會導致logical
錯誤,這些錯誤有時更難以檢測到。這取決於程序員決定什麼是最適合每種情況的......
如果你想有一個empty
對象與isEmpty()
方法,你只需要決定什麼「空」意味着在你的對象的情況。然後,您可以圍繞自定義類object
的空白構建自己的規則。
您可以使用在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(「」)
我所做的是對變量分配,你知道你將永遠不會使用的值。
例如我曾經給一個字符串賦值:「DELETED」,我知道它永遠不會出現。這樣它不僅可以處理PMD,還可以避免一些潛在的NullPointerException。
分配null的問題是null可能有幾個含義:變量(或字段)未初始化,值不存在或不適用。因此,程序員要記住(或發現)在特定情況下的空值是什麼。
替代方法是使用空對象模式或使用選項類型(請參閱Java中的可選類)。 本維基百科文章涵蓋了所有內容:https://en.wikipedia.org/wiki/Nullable_type
現在回到PMD,我認爲這取決於您的團隊是否想要遵循此規則以及您想如何修復它。
禁止PMD ...它不能告訴你該怎麼做! – ZhongYu
檢查此: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
@ProPhil你可以在PMD抱怨的地方顯示代碼片段嗎?環境在這裏很重要。 – CKing