亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

「技能分享」有效處理空值的10個技巧,學(xué)不會算我輸

當(dāng)我們開始使用Java進(jìn)行編程時,很多人會把null值當(dāng)做敵人,并且害怕NullPointerExceptions,下面給大家分享10個有效處理空值的技巧。
「技能分享」有效處理空值的10個技巧,學(xué)不會算我輸

1.不要過于復(fù)雜

就其本身而言,處理null可能是一個復(fù)雜的問題,因此我們應(yīng)使其盡可能整潔和明顯。我在某些代碼庫中看到的一種非常糟糕的做法是在簡單的空檢查就足夠了的地方使用Objects方法,Optional類,甚至使用Optional的單獨(dú)方法。

這導(dǎo)致我檢查該方法的來源,包含的內(nèi)容,并想知道此方法與直接比較之間的區(qū)別是什么。當(dāng)然,您的里程可能會有所不同,但是對我來說,這是我們應(yīng)該避免的大量開銷。

if (Optional.ofNullable(myVariable).isPresent()) // bad
if (Objects.nonNull(myVariable)) // better, but still bad
if (myVariable != null) // good

2.使用對象方法作為流謂詞

雖然對象isNull和Objects ,nonNull不是典型的null檢查的最佳選擇,它們非常適合與流一起使用。與之相比,使用它們進(jìn)行過濾或匹配的行的讀取(可以說)要好得多。實(shí)際上,這就是在JDK中引入它們的原因。

myStream.filter(Objects::nonNull)
myStream.anyMatch(Objects::isNull)

3.永遠(yuǎn)不要將Null作為參數(shù)

這是良好編碼的最重要原則之一,但是如果您還不了解它,就應(yīng)該對它進(jìn)行解釋。傳遞null表示給定參數(shù)沒有值可能是一個可行的選擇。但是它有兩個很大的缺點(diǎn):

  1. 您需要閱讀該函數(shù)的實(shí)現(xiàn),并弄清楚它以及可能受影響的每個函數(shù)能否正確處理空值。
  2. 在更改函數(shù)的實(shí)現(xiàn)時,您必須始終小心,不要丟掉可能為用戶處理空值的內(nèi)容。否則,您必須搜索整個源代碼以檢查是否在任何地方傳遞了null。

通過接受永不傳遞null的原則,這兩個問題將永遠(yuǎn)消失。那么帶有可選參數(shù)的函數(shù)呢?很簡單,只需使用不同的參數(shù)集重載函數(shù)即可:

void kill() {
    kill(self);
}
void kill(Person person) {
    person.setDeathTime(now());
}

順便說一下,由于這兩個缺點(diǎn)在單個類的范圍內(nèi)并不明顯,因此在處理私有方法時可以放棄該規(guī)則。只要確保事物從外面是安全的即可。

4.驗(yàn)證公共API參數(shù)

您和您的團(tuán)隊(duì)可能會使用不成功傳遞null的原理,但是當(dāng)公開公共API時,您無法控制其用戶以及將其傳遞給函數(shù)的內(nèi)容。因此,請務(wù)必檢查傳遞給公共API的參數(shù)的正確性。

如果您唯一關(guān)心的是參數(shù)的無效性,請考慮使用Objects類中的requireNonNull函數(shù):

public Foo(Bar bar, Baz baz) {
    this.bar = Objects.requireNonNull(bar, "bar must not be null");
    this.baz = Objects.requireNonNull(baz, "baz must not be null");
}

5. Leverage Optional

在Java 8之前,通常會在缺少值的情況下將方法返回null。這天生就是容易出錯的,因?yàn)殚_發(fā)人員必須經(jīng)常檢查文檔,或者如果缺少文檔,則返回可能的null的基礎(chǔ)源代碼。

自從JDK 8發(fā)布以來,我們有了Optional類,該類專門設(shè)計(jì)用于指示可能缺少返回值。開發(fā)人員調(diào)用以O(shè)ptional作為返回值的方法時,必須顯式處理不存在該值的情況。

因此,在適用時,請使用Optional來包裝您的返回類型。


Optional<String> makingYouCheck() {
    // stuff
}
makingYouCheck().orElseThrow(ScrewYouException::new);

6.返回空集合而不是空

我們已經(jīng)知道null不是方法的最佳返回值,并且我們可以使用 Optional類來指示該值可能丟失。但是當(dāng)我們談?wù)摷蠒r,情況有所不同。

由于集合可以包含任意數(shù)量的元素,因此它也可以包含…0個元素!在Collections類中甚至有特殊的emptyXxx方法返回此類集合。

因此,我們應(yīng)該避免返回null或使用Optional使事情復(fù)雜化,并且在沒有值可填充時返回空集合。

List<String> findSomething() {
    if (someCondition) {
        return Collections.emptyList();
    }
    // stuff
}

7.可選字段

正如我已經(jīng)說過的那樣,Optional旨在指示缺少的返回值。類字段是一種誘人的案例,它不是為設(shè)計(jì)而設(shè)計(jì)的,而且肯定不是必需的。通過封裝,您應(yīng)該完全控制字段的值,包括null。另一方面,將字段設(shè)置為顯式可選可能會給您帶來奇怪的問題,例如:

  • 您應(yīng)該如何為此類字段編寫構(gòu)造函數(shù)或設(shè)置方法?
  • 即使在確定值存在的情況下,您也必須處理Optional。
  • 自動映射器應(yīng)如何處理這些字段?

因此,對字段使用直接引用,并仔細(xì)分析字段在任何給定點(diǎn)是否可以為空。如果您的班級得到了很好的封裝,那么這應(yīng)該很容易。

8.對空使用異常

您可能會看到人們使用null的一種奇怪情況是例外情況。這是一種固有的容易出錯的做法,因?yàn)殛P(guān)鍵錯誤可以在系統(tǒng)的不同位置被忽略或重新出現(xiàn),從而使調(diào)試變得很痛苦。因此,如果出現(xiàn)問題,請始終拋出異常,而不是返回null。

9.測試您的代碼

此建議與各種錯誤有關(guān),不僅是意外的null,而且它是如此重要,以至于我認(rèn)為應(yīng)該將其列入清單。使用類似于生產(chǎn)環(huán)境的環(huán)境徹底測試代碼是防止NPE的好方法。切勿在未確保其正常工作的情況下發(fā)布一段代碼。沒有所謂的“不需要測試的快速,簡單的修復(fù)程序”。

10.仔細(xì)檢查

每當(dāng)您假設(shè)某個引用不能為空時,請仔細(xì)檢查您是否正確。在處理龐大的舊數(shù)據(jù)庫或外部提供程序時,這一點(diǎn)尤其重要。對于前者,請花一些時間檢查您要使用的列是否不包含任何空值,如果包含,則檢查這些行是否可以將其放入您的系統(tǒng)中。

如果是外部提供商,則依賴合同,文檔,如果不確定,請發(fā)送電子郵件或致電某人以確保您的假設(shè)正確。這可能很煩人,尤其是在使用文檔記錄不完善的API時,但涉及到null:安全勝過抱歉!

好啦!今天的分享到這里就結(jié)束了,希望大家持續(xù)關(guān)注馬哥教育!

文章來源于網(wǎng)絡(luò),侵刪!

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!