java replaceall删除中括号和内容_「技术文章」《阿里巴巴 Java 开发手册》精华摘要...
一、寫在開頭
Java作為一個編程界最流行的語言之一,有著很強的生命力。代碼的編寫規范也是不容忽視的,今天,我就把自己閱讀的國內的互聯網巨頭阿里巴巴的《阿里巴巴 Java 開發手冊》一些精彩內容摘錄如下。以饗讀者。《阿里巴巴Java開發手冊 終極版v1.3.0.pdf》 下載地址
《阿里巴巴Java開發手冊 終極版v1.3.0.pdf》
二、精彩摘錄
4.1)【命名風格】
【01 強制】抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結尾;測試類 命名以它要測試的類的名稱開始,以 Test 結尾。
【02 強制】中括號是數組類型的一部分,數組定義如下:String[] args; 反例:使用 String args[]的方式來定義。
【03強制】POJO 類中布爾類型的變量,都不要加 is,否則部分框架解析會引起序列化錯誤。
==反例:定義為基本數據類型 Boolean isDeleted;的屬性,它的方法也是 isDeleted(), 框架在反向解析的時候,“以為”對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異 常。
【04 強制】包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使用 單數形式,但是類名如果有復數含義,類名可以使用復數形式。 正例: 應用工具類包名為 com.alibaba.open.util、類名為 MessageUtils(此規則參考 spring 的框架結構)
【05 推薦】如果模塊、接口、類、方法使用了設計模式,在命名時體現出具體模式
【06 推薦】接口類中的方法和屬性不要加任何修飾符號(public 也不要加),保持代碼的簡潔 性,并加上有效的 Javadoc 注釋。盡量不要在接口里定義變量,如果一定要定義變量,肯定是 與接口方法相關,并且是整個應用的基礎常量。 正例:接口方法簽名:void f(); 接口基礎常量表示:String COMPANY = "alibaba"; 反例:接口方法定義:public abstract void f(); 說明:JDK8 中接口允許有默認實現,那么這個 default 方法,是對所有實現類都有價值的默 認實現。
【不是很理解--todo】接口和實現類的命名有兩套規則:
1)【強制】對于 Service 和 DAO 類,基于 SOA 的理念,暴露出來的服務一定是接口,內部 的實現類用 Impl 的后綴與接口區別。 正例:CacheServiceImpl 實現 CacheService 接口。
2)【推薦】如果是形容能力的接口名稱,取對應的形容詞做接口名(通常是–able 的形式)。 正例:AbstractTranslator 實現 Translatable。
4.2)【常量定義】
【不是很理解--todo】【強制】不允許任何魔法值(即未經定義的常量)直接出現在代碼中。 反例:String key = "Id#taobao_" + tradeId; cache.put(key, value);
4.3)【代碼格式】
【01 強制】大括號的使用約定。如果是大括號內為空,則簡潔地寫成{}即可,不需要換行;如果 是非空代碼塊則: 1) 左大括號前不換行。 2) 左大括號后換行。 3) 右大括號前換行。 4) 右大括號后還有 else 等代碼則不換行;表示終止的右大括號后必須換行。
【02 強制】if/for/while/switch/do 等保留字與括號之間都必須加空格。
【03 強制】任何二目、三目運算符的左右兩邊都需要加一個空格。 說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號等。
【04 強制】注釋的雙斜線與注釋內容之間有且僅有一個空格。 正例:// 注釋內容,注意在//和注釋內容之間有一個空格。
4.4)【OOP規約】
【01 強制】Object 的 equals 方法容易拋空指針異常,應使用常量或確定有值的對象來調用 equals。
==正例:"test".equals(object); 反例:object.equals("test"); 說明:推薦使用 java.util.Objects#equals(JDK7 引入的工具類)
【02 強制】所有的相同類型的包裝類對象之間值的比較,全部使用 equals 方法比較。
說明:對于 Integer var = ? 在-128 至 127 范圍內的賦值,Integer 對象是在 IntegerCache.cache 產生,會復用已有對象,這個區間內的 Integer 值可以直接使用==進行 判斷,但是這個區間之外的所有數據,都會在堆上產生,并不會復用已有對象,這是一個大坑, 推薦使用 equals 方法進行判斷。
關于基本數據類型與包裝數據類型的使用標準如下:
1) 【強制】所有的 POJO 類屬性必須使用包裝數據類型。
2) 【強制】RPC 方法的返回值和參數必須使用包裝數據類型。
3) 【推薦】所有的局部變量使用基本數據類型。
==說明:POJO 類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值,任何 NPE (即空指針異常)問題,或者入庫檢查,都由使用者來保證。
==正例:數據庫的查詢結果可能是 null,因為自動拆箱,用基本數據類型接收有 NPE 風險。
==反例:比如顯示成交總額漲跌情況,即正負 x%,x 為基本數據類型,調用的 RPC 服務,調用 不成功時,返回的是默認值,頁面顯示為 0%,這是不合理的,應該顯示成中劃線。所以包裝 數據類型的 null 值,能夠表示額外的信息,如:遠程調用失敗,異常退出。
參考:Java中基本數據類型和包裝類
【03 強制】序列化類新增屬性時,請不要修改 serialVersionUID 字段,避免反序列失敗;如 果完全不兼容升級,避免反序列化混亂,那么請修改 serialVersionUID 值。 說明:注意 serialVersionUID 不一致會拋出序列化運行時異常。
【04 強制】POJO 類必須寫 toString 方法。使用 IDE 的中工具:source> generate toString 時,如果繼承了另一個 POJO 類,注意在前面加一下 super.toString。 說明:在方法執行拋出異常時,可以直接調用 POJO 的 toString()方法打印其屬性值,便于排 查問題。
【05 推薦】當一個類有多個構造方法,或者多個同名方法,這些方法應該按順序放置在一起, 便于閱讀,
【06 推薦】 類內方法定義順序依次是:公有方法或保護方法 > 私有方法 > getter/setter 方法。
【07 推薦】循環體內,字符串的連接方式,使用 StringBuilder 的 append 方法進行擴展。
==說明:反編譯出的字節碼文件顯示每次循環都會 new 出一個 StringBuilder 對象,然后進行 append 操作,最后通過 toString 方法返回 String 對象,造成內存資源浪費。
==反例: String str = "start"; for (int i = 0; i < 100; i++) { str = str + "hello"; }
【08 推薦】類成員與方法訪問控制從嚴:
1) 如果不允許外部直接通過 new 來創建對象,那么構造方法必須是 private。
2) 工具類不允許有 public 或 default 構造方法。
3) 類非 static 成員變量并且與子類共享,必須是 protected。
4) 類非 static 成員變量并且僅在本類使用,必須是 private。
5) 類 static 成員變量如果僅在本類使用,必須是 private。
6) 若是 static 成員變量,必須考慮是否為 final。
7) 類成員方法只供類內部調用,必須是 private。
8) 類成員方法只對繼承類公開,那么限制為 protected。
==說明:任何類、方法、參數、變量,嚴控訪問范圍。過于寬泛的訪問范圍,不利于模塊解耦。 思考:如果是一個 private 的方法,想刪除就刪除,可是一個 public 的 service 方法,或者 一個 public 的成員變量,刪除一下,不得手心冒點汗嗎?變量像自己的小孩,盡量在自己的 視線內,變量作用域太大,無限制的到處跑,那么你會擔心的。
4.5)【集合處理】
【01 強制】關于 hashCode 和 equals 的處理,遵循如下規則:
1) 只要重寫 equals,就必須重寫 hashCode。
2) 因為 Set 存儲的是不重復的對象,依據 hashCode 和 equals 進行判斷,所以 Set 存儲的 對象必須重寫這兩個方法。
3) 如果自定義對象做為 Map 的鍵,那么必須重寫 hashCode 和 equals。 說明:String 重寫了 hashCode 和 equals 方法,所以我們可以非常愉快地使用 String 對象 作為 key 來使用。
【02 強制】ArrayList的subList結果不可強轉成ArrayList,否則會拋出ClassCastException 異常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList.
==說明:subList 返回的是 ArrayList 的內部類 SubList,并不是 ArrayList ,而是 ArrayList 的一個視圖,對于 SubList 子列表的所有操作最終會反映到原列表上。
== 例子:https://blog.csdn.net/qq_15118961/article/details/80893780
【03 強制】在 subList 場景中,高度注意對原集合元素個數的修改,會導致子列表的遍歷、增加、 刪除均會產生 ConcurrentModificationException 異常。
【04 強制】使用集合轉數組的方法,必須使用集合的 toArray(T[] array),傳入的是類型完全 一樣的數組,大小就是 list.size()。
【05 強制】使用工具類 Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方 法,它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。
== 說明:asList 的返回對象是一個 Arrays 內部類,并沒有實現集合的修改方法。Arrays.asList 體現的是適配器模式,只是轉換接口,后臺的數據仍是數組。
==String[] str = new String[] { "you
總結
以上是生活随笔為你收集整理的java replaceall删除中括号和内容_「技术文章」《阿里巴巴 Java 开发手册》精华摘要...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DDR3 vs DDR2内存:频率带宽大
- 下一篇: 未公开接口主要指以下哪几类_Java8的