成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

記一次愚蠢的經(jīng)歷--String不可變性

woshicixide / 1820人閱讀

摘要:文本已收錄至我的倉(cāng)庫(kù),歡迎記錄一次在寫代碼時(shí)愚蠢的操作,本文涉及到的知識(shí)點(diǎn)不可變性一交代背景我這邊有一個(gè)系統(tǒng),提供一個(gè)接口去發(fā)送短信。

前言
只有光頭才能變強(qiáng)。

文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y

記錄一次在寫代碼時(shí)愚蠢的操作,本文涉及到的知識(shí)點(diǎn):String不可變性

一、交代背景

我這邊有一個(gè)系統(tǒng),提供一個(gè)RPC接口去發(fā)送短信。外部調(diào)用我的接口需要傳入手機(jī)號(hào)等等參數(shù),我這邊負(fù)責(zé)解析這些參數(shù)、做一些業(yè)務(wù)的處理,然后調(diào)用短信渠道商的接口發(fā)送短信。

每當(dāng)調(diào)用完短信渠道商的接口時(shí),我會(huì)對(duì)這次發(fā)送的記錄入庫(kù)(存入MySQL中),同樣地短信渠道商會(huì)返回發(fā)送或失敗的回執(zhí)給我,我也會(huì)入庫(kù)(存入MySQL中)。

那天,有人來找到我,說某個(gè)手機(jī)號(hào)收不到短信,用戶并沒有屏蔽短信(欠費(fèi)、關(guān)機(jī))等等一些操作,就是收不到短信。

于是我就去排查啦,首先我先去DB里邊找有沒有對(duì)應(yīng)的發(fā)送記錄,發(fā)現(xiàn)這條記錄是存在的,而且在DB上看不出來有什么異常。

所以,這就排除了這個(gè)操作在中途被攔截的情況(因?yàn)橐呀?jīng)入庫(kù)了,就肯定調(diào)用過短信運(yùn)營(yíng)商的接口)

后來就去撈日志,看看調(diào)用短信運(yùn)營(yíng)商返回的Result對(duì)象的信息是什么,然后就去問了一下短信運(yùn)營(yíng)商可能出現(xiàn)這種問題的原因是什么。那邊回復(fù)的是:“如果是部分的手機(jī)號(hào)出現(xiàn)這種狀況,是不是你們的手機(jī)號(hào)沒有trim???

于是,我又去撈日志,發(fā)現(xiàn)手機(jī)號(hào)后面真的帶有一個(gè)空格(扎心了,之前一直看不到)。要處理這個(gè)問題就變得異常簡(jiǎn)單了,我只要在入口里邊對(duì)手機(jī)號(hào)進(jìn)行trim就好了。

二、編寫代碼

我這邊是支持同一條短信向多個(gè)手機(jī)號(hào)發(fā)送,于是手機(jī)號(hào)我這邊用的是HashSet來進(jìn)行接收。對(duì)手機(jī)號(hào)進(jìn)行trim我寫下了如下的代碼:

// 說明:Task對(duì)象 有個(gè) key屬性,這個(gè)key屬性的類型是HashSet

if (task.getKey() != null && task.getKey().size() > 0) {
    for (String s : task.getKey()) {
        s.trim();
    }
}

代碼很簡(jiǎn)單,我做的就兩步:

判斷是否為null,不為null值則遍歷手機(jī)號(hào)集合

對(duì)每個(gè)手機(jī)號(hào)進(jìn)行trim

上面的代碼有問題嗎?必須有問題啊,沒問題我還寫啥。

下面寫個(gè)小Demo,我們會(huì)發(fā)現(xiàn):在代碼的11行上調(diào)用trim()方法后,在12行再輸出,還是會(huì)有空格的情況。

2.1 為什么會(huì)有這種錯(cuò)覺?

其實(shí),我們?cè)诔鯇W(xué)Java的時(shí)候,肯定會(huì)學(xué)到String類。在學(xué)習(xí)的時(shí)候也是明確String是不可變的,但總是有個(gè)感覺我們把String對(duì)象給改了,為什么?

我覺得第一點(diǎn)是這樣的:我們操作的往往是可變的對(duì)象,對(duì)象的某些屬性改了,我們就認(rèn)為已經(jīng)改了。比如下面的代碼:

HashSet students = getStudent();
for (Student s1 : students) {
    s1.setName("Java3y");
}

執(zhí)行完,我們就認(rèn)為在HashSet里邊的Student的名字全改成Java3y了,而實(shí)際上也是如此。

我覺得第二點(diǎn)是這樣的:我們平時(shí)操作String對(duì)象,都是直接把操作后的結(jié)果傳過去,這看起來就像修改原對(duì)象了一樣。比如下面類似的代碼:

// 去重
String phone = "   137888888888    ";
sendPhone(phone.trim());

// 轉(zhuǎn)成大寫后輸出
System.out.println(phone.toUpperCase());

// ... 等等

2.2 怎么改

現(xiàn)在問題已經(jīng)知道了,String對(duì)象是不可變的,對(duì)String對(duì)象進(jìn)行操作,“看似”把原來的String對(duì)象改了,實(shí)際上是生成了一個(gè)新的String對(duì)象。

回到我那個(gè)問題,也很好解決,把trim好的手機(jī)號(hào)設(shè)置到HashSet就行了

// 說明:Task對(duì)象 有個(gè) key屬性,這個(gè)key屬性的類型是HashSet

HashSet hs = new HashSet();
if (task.getKey() != null && task.getKey().size() > 0) {
    for (String s : task.getKey()) {
        hs.add(s.trim());
    }
}
task.setKey(hs);
最后

這個(gè)B寫了一篇文章來解釋自己是怎么“合理“寫B(tài)ug的,真不要臉。

樂于輸出干貨的Java技術(shù)公眾號(hào):Java3y。公眾號(hào)內(nèi)有200多篇原創(chuàng)技術(shù)文章、海量視頻資源、精美腦圖,關(guān)注即可獲取!

覺得我的文章寫得不錯(cuò),點(diǎn)!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75554.html

相關(guān)文章

  • 一次愚蠢操作--線程安全問題

    摘要:文本已收錄至我的倉(cāng)庫(kù),歡迎記一次在工作中愚蠢的操作,本文關(guān)鍵字線程安全我怎么天天在寫啊一交代背景我這邊有一個(gè)系統(tǒng),提供一個(gè)接口去發(fā)送各種信息比如短信郵件微信等等渠道。小王用了一陣子也沒說有什么問題,于是這個(gè)需求就交付了。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y 記一次在工作中愚蠢...

    Forelax 評(píng)論0 收藏0
  • 一次 Booking 線上面試中遇到小問題

    從事 Android 開發(fā)工作要滿 5 年了,雖然明白自己技術(shù)很一般,但是也總是期望能夠有機(jī)會(huì)進(jìn)入更好的平臺(tái)發(fā)展。這不,因?yàn)闄C(jī)緣巧合有了一次 Booking 的面試邀請(qǐng)(是在 hackerrank 上),然后開始臨時(shí)抱佛腳 (leetcode 走起),最終選擇了一個(gè)周末去完成線上測(cè)試,結(jié)果我完全沒預(yù)料到。本以為會(huì)被某道題的邏輯繞昏,結(jié)果哪知道被標(biāo)準(zhǔn)輸入這個(gè)東西卡得死死的,現(xiàn)在就記錄一下這次非常糟...

    lykops 評(píng)論0 收藏0
  • [譯] Python 學(xué)習(xí) —— __init__() 方法 1

    摘要:第一是在對(duì)象生命周期中初始化是最重要的一步每個(gè)對(duì)象必須正確初始化后才能正常工作。第二是參數(shù)值可以有多種形式?;悓?duì)象的方法對(duì)象生命周期的基礎(chǔ)是它的創(chuàng)建初始化和銷毀。在某些情況下,這種默認(rèn)行為是可以接受的。 注:原書作者 Steven F. Lott,原書名為 Mastering Object-oriented Python __init__()方法意義重大的原因有兩個(gè)。第一是在對(duì)象生命...

    MobService 評(píng)論0 收藏0
  • 如果連鐵將軍都不再可靠--一次排查使用分布式輪候鎖+SESSION防訂單重復(fù)仍然加鎖失效問題經(jīng)歷

    摘要:盡可能地將數(shù)據(jù)寫入,例如創(chuàng)建設(shè)置的都會(huì)將數(shù)據(jù)立即的寫入再來看看文檔怎么描述的看看這可愛的默認(rèn)值我們終于知道了當(dāng)我們不做任何設(shè)置時(shí),默認(rèn)采用的是方式顯而易見,使用方式能最大限度的減少與的交互,而在大多數(shù)場(chǎng)景下都是沒有問題的。 0.問題背景 此次問題源于一次挺嚴(yán)重的生產(chǎn)事故:客戶的訂單被重復(fù)生成了,而出問題的代碼其實(shí)很簡(jiǎn)單: // .... redisLockUtil.lock(membe...

    econi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<