阿里雲JAVA開發規范考試總結


JAVA開發手冊考試總結

編程規范

  1. POJO(Plain Ordinary Java Object): POJO 專指只有 setter / getter / toString的簡單類,包括DO/DTO/BO/VO等。

    DO(Data Object):此對象與數據庫表結構一一對應,通過 DAO 層向上傳輸數據源對象。
    DTO(Data Transfer Object):數據傳輸對象,Service 或 Manager 向外傳輸的對象。
    BO(Business Object):業務對象,由 Service 層輸出的封裝業務邏輯的對象。
    AO(ApplicationObject):應用對象,在Web層與Service層之間抽象的復用對象模型, 極為貼近展示層,復用度不高。
    VO(View Object):顯示層對象,通常是 Web 向模板渲染引擎層傳輸的對象。
    
  2. foreach中不要進行remove和add操作,remove元素請使用 Iterator方式,如果並發操作,需要對 Iterator 對象加鎖。

  3. 使用 CountDownLatch 進行異步轉同步操作,每個線程退出前必須調用 countDown 方法,線程執行代碼注意 catch 異常,確保 countDown 方法被執行到,避免主線程無法執行 至 await 方法,直到超時才返回結果。 說明:注意,子線程拋出異常堆棧,不能在主線程 try-catch 到 )

  4. 線程池不允許使用 Executors 去創建,而是通過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險。說明:Executors 返回的線程池對象的弊端如下:

    1)FixedThreadPool 和 SingleThreadPool:
    允許的請求隊列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM。
    2)CachedThreadPool 和 ScheduledThreadPool:
    允許的創建線程數量為 Integer.MAX_VALUE,可能會創建大量的線程,從而導致 OOM。

  5. Hashtable/ConcurrentHashMap的K/V都不允許為null, HashMap的K/V都允許為null, TreeMap的K不允許為null、V允許為null。

  6. 不要在視圖模板中(vm)中加入變量聲明, 邏輯運算符, 更不要在vm中加入任何復雜的邏輯, 視圖的職責是展示, 不要搶模型和控制器的活。

  7. ArrayList的subList的類型是java.util.RandomAccessSubList, 是ArrayList的一個視圖, 不能強轉成ArrayList; 對於SubList子列表的所有操作最終會反映到原列表上; 對原列表的修改, 會導致子列表的遍歷、增加、刪除均會產生ConcurrentModificationException異常; 同時, subList沒有實現Serializable接口, 若RPC接口的List類型參數接受了SubList類型的實參,則在RPC調用時會報出序列化異常。比如我們常用的guava中的Lists.partition,切分后的子list實際都是SubList類型,在傳給RPC接口之前,需要用new ArrayList()包一層,否則會報序列化異常。

  8. 所有的相同類型的包裝類對象之間值的比較,全部使用 equals 方法比較。

  9. final 可以聲明類、成員變量、方法、以及本地變量。

    final修飾的class代表不可繼承擴展、修飾變量是不可以被修改、修飾方法代表不可以被重寫

    下列情況使用 final 關鍵:

    1. 不允許被繼承的類,如:String 類。  
    2. 不允許修改引用的域對象。  
    3. 不允許被重寫的方法,如:POJO 類的 setter 方法。
    

單元測試

  1. 好的單元測試必須遵守AIR原則: A->Automatic(自動化), I->Independent(獨立性), R->Repeatable(可重復)。
  2. 編寫單元測試代碼遵守BCDE原則, 以保證被測試模塊的交付質量: B->Border 邊界測試; C->Correct 正確的輸入, 預期的結果; D->Design 與設計文檔相結合, 來編寫單元測試; E->Error 強制錯誤信息輸入, 預期的結果。

安全規范

  1. Web應用必須正確配置 Robots文件,非 SEO URL必須配置為禁止爬蟲訪問。SEO-Search Engine Optimization。

異常處理

  1. 對 trace/debug/info 級別的日志輸出,必須使用條件輸出形式或者使用占位符的方 式。

  2. Java 類庫中定義的可以通過預檢查方式規避的 RuntimeException 異常不應該通過 catch 的方式來處理,比如:NullPointerException,IndexOutOfBoundsException 等等。

    說明:無法通過預檢查的異常除外,比如,在解析字符串形式的數字時,不得不通過 catch NumberFormatException 來實現。 正例:if (obj != null) {...} 反例:try { obj.method(); } catch (NullPointerException e) {…}

  3. Checked異常必須被顯式地 捕獲 或者 傳遞(向上拋出,沿着調用棧 繼續向上傳播該異常),如try-catch-finally ,throws Exception 。而unchecked異常則可以不必 捕獲 或 拋出。Checked異常繼承自 java.lang.Exception類(一般異常)。Unchecked異常繼承自java.lang.RuntimeException類(運行時異常)。

    將派生於Error或者RuntimeException的異常稱為unchecked異常。

MySQL數據庫

  1. 在 varchar 字段上建立索引時,必須指定索引長度,沒必要對全字段建立索引,根據 實際文本區分度決定索引長度即可。

  2. 業務上具有唯一特性的字段,即使是多個字段的組合,也必須建成唯一索引,varchar 是可變長字符串,不預先分配存儲空間,長度不要超過 5000,如果存儲長 度大於此值,定義字段類型為 text,獨立出來一張表,用主鍵來對應,避免影響其它字段索 引效率。

  3. 如果有 order by 的場景,請注意利用索引的有序性。order by 最后的字段是組合索引的一部分,並且放在索引組合順序的最后,避免出現 file_sort 的情況,影響查詢性能。 正例:where a=? and b=? order by c; 索引:a_b_c 反例:索引中有范圍查找,那么索引有序性無法利用,如:WHERE a>10 ORDER BY b; 索引 a_b 無法排序。

  4. 建組合索引的時候,區分度最高的在最左邊。 正例:如果 where a=? and b=? ,如果 a 列的幾乎接近於唯一值,那么只需要單建 idx_a 索引即可。 說明:存在非等號和等號混合時,在建索引時,請把等號條件的列前置。如:where c>? and d=? 那么即使 c 的區分度更高,也必須把 d 放在索引的最前列,即索引 idx_d_c。

  5. 復合索引為idx_A_B_C,所以查詢條件只能是在a,ab,abc,ac才算 使用到索引idx_A_B_C

  6. 在代碼中寫分頁查詢邏輯時,若 count為 0應直接返回,避免執行后面的分頁語句。

  7. 不要使用 count(列名)或 count(常量)來替代 count(),count()是 SQL92 定義的 標准統計行數的語法,跟數據庫無關,跟 NULL 和非 NULL 無關。 說明:count(*)會統計值為 NULL 的行,而 count(列名)不會統計此列為 NULL 值的行。

    count(distinct col) 計算該列除 NULL 之外的不重復行數,注意 count(distinct col1, col2) 如果其中一列全為 NULL,那么即使另一列有不同的值,也返回為 0。當某一列的值全是 NULL 時,count(col)的返回結果為 0,但 sum(col)的返回結果為 NULL,因此使用 sum()時需注意 NPE 問題。 正例:可以使用如下方式來避免 sum 的 NPE 問題:SELECT IF(ISNULL(SUM(g)),0,SUM(g)) FROM table

工程結構

  1. GAV規范

    GroupID格式:com.{公司}.業務線[.子業務線]  栗子:com.taobao.jstorm 或 com.alibaba.dubbo.register 
    ArtifactID 格式:產品線名-模塊名。栗子:dubbo-client / fastjson-api / jstorm-tool 
    Version: 
    主版本號:產品方向改變,或者大規模 API 不兼容,或者架構不兼容升級。   
    次版本號:保持相對兼容性,增加主要功能特性,影響范圍極小的 API 不兼容修改。  
    修訂號:保持完全兼容性,修復 BUG、新增次要功能特性等。 
    注意起始版本號必須為:1.0.0,而不是 0.0.1 
    
  2. 外部正在調用或者二方庫依賴的接口,不允許修改方法簽名,避免對接口調用方產生 影響。接口過時必須加@Deprecated 注解,並清晰地說明采用的新接口或者新服務是什么。

  3. 二方庫的新增或升級,保持除功能點之外的其它 jar 包仲裁結果不變。如果有改變, 必須明確評估和驗證,建議進行 dependency:resolve 前后信息比對,如果仲裁結果完全不一 致,那么通過 dependency:tree 命令,找出差異點,進行 排除 jar 包。

    ​ dependency:resolve 打印出已解決依賴列表
    dependency:tree 打印層級依賴關系
    所有 pom 文件中的依賴聲明放在 語句塊中,所有版本仲裁放在 語句塊中

  4. 高並發服務器建議調小 TCP 協議的 time_wait 超時時間。

    在 linux 服務器上請通過變更/etc/sysctl.conf 文件去修改該缺省值(秒):      net.ipv4.tcp_fin_timeout = 30 
    
  5. 高並發服務器調大服務器所支持的最大文件句柄數

    主流的 linux 服務器默認所支持最大 fd 數量為 1024,當並發連接數很大時很
    阿里巴巴 Java 開發手冊 
      34/38 
    容易因為 fd 不足而出現“open too many files”錯誤,導致新的連接無法建立。 建議將 linux 服務器所支持的最大句柄數調高數倍(與服務器的內存數量相關)
    
  6. 集合初始化時,指定集合初始值大小。

  7. PECS(Producer Extends Consumer Super)原則:第一、頻繁往外讀取內 容的,適合用<? extends T>。第二、經常往里插入的,適合用<? super T>。

  8. 使用工具類 Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方 法,它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常

  9. 使用集合轉數組的方法,必須使用集合的 toArray(T[] array),傳入的是類型完全 一樣的數組,大小就是 list.size()。

設計規范

系統架構設計的目的:

  1. 確定系統邊界。確定系統在技術層面上的做與不做。
  2. 確定系統內模塊之間的關系。確定模塊之間的依賴關系及模塊的宏觀輸入與輸出。
  3. 確定指導后續設計與演化的原則。使后續的子系統或模塊設計在規定的框架內繼續演化。
  4. 確定非功能性需求。非功能性需求是指安全性、可用性、可擴展性等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM