您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Spring中StringUtils的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Spring中StringUtils的示例分析”這篇文章吧。
起因
最近在寫CRUD的時候,發現有個分頁的VO寫的健壯性比較差,一時手癢改了一下,沒想到改了之后好幾個功能都出現了問題。
原VO關鍵代碼如下:
public class PageVo implements Serializable{ // ...省略所有無關代碼 Map<String, String> query }
這個VO是用于從前端分頁查詢時傳參,而query是用于傳遞查詢條件的(這里不討論用Map傳參是否合理)。當前端無查詢條件時則會導致query為null,如果不注意容易出現NPE。
所以我就改造成下面這樣了。
public class PageVo implements Serializable{ // ...省略所有無關代碼 Map<String, String> query=new HashMap<> }
但是沒想到就是這么簡單的改造居然都翻車(?ε?`)
沒辦法,只好去排查問題。
發現問題
想過很多種原因,但是我真沒想到居然是因為這樣(/‵Д′)/~ ╧╧,不多說了,問題關鍵代碼如下:
if (StringUtils.isEmpty(page.getQuery())) { // 省略處理邏輯 }
居然用StringUtils去判斷一個Map是否為空,好歹也換個CollectionUtils啊(╬ ̄皿 ̄)凸
雖然是前人挖坑,但是為什么Spring的`StringUtils居然設計成支持Object入參呢o_o ....
想了一下,還是去看看源碼吧
源碼分析
StringUtils的isEmpty()方法源碼超級簡單,三行代碼搞定(其實嚴格來說就一行代碼):
public static boolean isEmpty(@Nullable Object str) { return (str == null || "".equals(str)); }
既然我的Map對象不為null,那么問題應該是因為String的equals()方法。不多說,繼續跟蹤源碼
public boolean equals(Object anObject) { if (this == anObject) { return true; } // 問題出在這里 if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
這個equals()方法的邏輯很簡單
入參為null則返回true
入參不為String類型返回false
入參對象和this對象都為String就比較它們內置的char[]數組長度和每個char元素是否相同,滿足則返回true,否則返回false
而我的問題就是由第二點引起的,因為類型不相同┴─┴︵╰(‵□′╰)
以上是“Spring中StringUtils的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。