阿里Java編程規約(控制語句)

【強制】在一個 switch 塊內,每個 case 要么通過 continue/break/return 等來終止,要么

注釋說明程序將繼續執行到哪一個 case 為止;在一個 switch 塊內,都必須包含一個

default 語句并且放在最后,即使它什么代碼也沒有。

說明:注意 break 是退出 switch 語句塊,而 return 是退出方法體。

【強制】 switch 括號內的變量類型為 String 并且此變量為外部參數時,必須先進行 null

判斷。

反例:猜猜下面的代碼輸出是什么?

public static void method(String param) {switch (param) {// 肯定不是進入這里 case "sth":System.out.println("it's sth");break;// 也不是進入這里 case "null":System.out.println("it's null");break;// 也不是進入這里 default:System.out.println("default"); }} }

【強制】 if/else/for/while/do 語句中必須使用大括號。

說明:即使只有一行代碼,避免采用單行的編碼方式:if (condition) statements;

【強制】在高并發場景中,避免使用等于判斷作為中斷或退出的條件。

說明:如果并發控制沒有處理好,容易產生等值判斷被擊穿的情況,使用大于或小于的區間判斷條件

來代替。

反例:判斷剩余獎品數量等于 0 時,終止發放獎品,但因為并發處理錯誤導致獎品數量瞬間變成了負數,

這樣的話,活動無法終止。

【推薦】表達異常的分支時,少用 if-else 方式,這種方式可以改寫成:

if (condition) {

...

return obj; }

// 接著寫 else 的業務邏輯代碼;

說明:如果非使用 if()...else if()...else...方式表達邏輯,避免后續代碼維護困難,【強制】請勿超過 3 層。

正例:超過 3 層的 if-else 的邏輯判斷代碼可以使用衛語句、策略模式、狀態模式等來實現,其中衛語句

即代碼邏輯先考慮失敗、異常、中斷、退出等直接返回的情況,以方法多個出口的方式,解決代碼中判斷

分支嵌套的問題,這是逆向思維的體現。

示例如下:

public void findBoyfriend(Man man) {if (man.isUgly()) {System.out.println("本姑娘是外貌協會的資深會員");return; }if (man.isPoor()) {System.out.println("貧賤夫妻百事哀");return; }if (man.isBadTemper()) {System.out.println("銀河有多遠,你就給我滾多遠");return; }System.out.println("可以先交往一段時間看看"); }

【推薦】除常用方法(如 getXxx/isXxx)等外,不要在條件判斷中執行其它復雜的語句,將復

雜邏輯判斷的結果賦值給一個有意義的布爾變量名,以提高可讀性。

說明:很多 if 語句內的邏輯表達式相當復雜,與、或、取反混合運算,甚至各種方法縱深調用,理解成

本非常高。如果賦值一個非常好理解的布爾變量名字,則是件令人爽心悅目的事情。

正例:

// 偽代碼如下

final boolean existed = (file.open(fileName, "w") != null) && (...) || (...);

if (existed) {?...}

反例:

public final void acquire(long arg) {

if (!tryAcquire(arg) &&

acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) {

?selfInterrupt();

}

}

【推薦】不要在其它表達式(尤其是條件表達式)中,插入賦值語句。

說明:賦值點類似于人體的穴位,對于代碼的理解至關重要,所以賦值語句需要清晰地單獨成為一行。

反例:

public Lock getLock(boolean fair) {

// 算術表達式中出現賦值操作,容易忽略 count 值已經被改變 threshold = (count = Integer.MAX_VALUE) - 1;

// 條件表達式中出現賦值操作,容易誤認為是 sync==fair return (sync = fair) ? new FairSync() : new NonfairSync();

}

【推薦】循環體中的語句要考量性能,以下操作盡量移至循環體外處理,如定義對象、變

量、獲取數據庫連接,進行不必要的 try-catch 操作這個 try-catch 是否可以移至循環體

【推薦】避免采用取反邏輯運算符。

說明:取反邏輯不利于快速理解,并且取反邏輯寫法必然存在對應的正向邏輯寫法。

正例:使用 if (x < 628) 來表達 x 小于 628

反例:使用 if (!(x >= 628)) 來表達 x 小于 628

【推薦】接口入參保護,這種場景常見的是用作批量操作的接口。

【參考】下列情形,需要進行參數校驗:

1 調用頻次低的方法。

2 執行時間開銷很大的方法。此情形中,參數校驗時間幾乎可以忽略不計,但如果因為參數錯誤導致

中間執行回退,或者錯誤,那得不償失。

3 需要極高穩定性和可用性的方法。

4 對外提供的開放接口,不管是 RPC/API/HTTP 接口。

5 敏感權限入口。

【參考】下列情形,不需要進行參數校驗:

1 極有可能被循環調用的方法。但在方法說明里必須注明外部參數檢查要求。

2 底層調用頻度比較高的方法。畢竟是像純凈水過濾的最后一道,參數錯誤不太可能到底層才會暴露

問題。一般 DAO 層與 Service 層都在同一個應用中,部署在同一臺服務器中,所以 DAO 的參數校驗,可

以省略。

3 被聲明成 private 只會被自己代碼所調用的方法,如果能夠確定調用方法的代碼傳入參數已經做過檢

查或者肯定不會有問題,此時可以不校驗參數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445279.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445279.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445279.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據學習(5)-- NoSQL數據庫

文章目錄目錄1.NoSQL的介紹2.NoSQL產生的原因2.1 web2.02.2 NoSQL興起原因3.NoSQL和關系數據庫的區別4.NoSQL的四大類型4.1 鍵值數據庫4.2 列族數據庫4.3 文檔數據庫4.4 圖形數據庫4.5 不同類型的NoSQL數據庫進行比較5.NoSQL的三大基石5.1 CAP5.2 base5.3 最終一致性6.從NoSQL到…

經典算法重點總結

文章目錄排序算法冒泡排序直接插入排序希爾排序直接選擇排序快速排序堆排序歸并排序總結查找算法順序查找二分查找插值查找斐波那契查找樹表查找分塊查找哈希查找總結排序算法 冒泡排序 void bubbleSort(int a[] , int n){for(int i n-1 ; i > 0 ; i--){for(int j 0 ; j …

Python(18)-字典dictionary、集合

Python高級數據類型-字典1.字典的定義2.字典的基本操作:查詢&#xff0c;增加&#xff0c;修改&#xff0c;獲取3.字典的統計、合并、清空4.字典的循環遍歷5.返回最大“值”對應的“鍵”6.應用場景pop(key)7.集合字典是除了列表之外最靈活的數據類型&#xff0c;用來描述一個物…

redis——Redis中的LRU算法改進

redis通常使用緩存&#xff0c;是使用一種固定最大內存的使用。當數據達到可使用的最大固定內存時&#xff0c;我們需要通過移除老數據來獲取空間。redis作為緩存是否有效的重要標志是如何尋找一種好的策略&#xff1a;刪除即將需要使用的數據是一種糟糕的策略&#xff0c;而刪…

redis——HyperLogLog

HyperLogLog 是一種概率數據結構&#xff0c;用來估算數據的基數。數據集可以是網站訪客的 IP 地址&#xff0c;E-mail 郵箱或者用戶 ID。 基數就是指一個集合中不同值的數目&#xff0c;比如 a, b, c, d 的基數就是 4&#xff0c;a, b, c, d, a 的基數還是 4。雖然 a 出現兩次…

機器學習知識總結系列-機器學習中的優化算法總結(1-4)

文章目錄1.梯度下降1.1批量梯度下降(BGD)1.2隨機梯度下降&#xff08;SGD&#xff09;1.3 小批量隨機梯度下降&#xff08;MSGD&#xff09;1.4 比較&#xff1a;1.5 動量算法&#xff08;momentum&#xff09;1.6 Nestrov Momentum2. 自適應方法2.1 自適應學習率算法&#xff…

Python(19)-字符串、Unicode字符串

高級數據類型--字符串、Unicode字符串1.字符串的定義2.字符串的長度、計數、Index3.字符串常用方法3.1判斷類型3.2查找和替換3.3文本對齊3.4去除空白字符.strip()4.字符串的拆分和拼接5.字符串的切片6.跨行字符串7.包含轉義字符r8.字符串的分割與連接9.Unicode字符串字符串-不變…

機器學習中的距離和損失函數

文章目錄13.1 距離度量13.2 損失函數13.1 距離度量 距離函數種類&#xff1a;歐式距離、曼哈頓距離、明式距離&#xff08;閔可夫斯基距離&#xff09;、馬氏距離、切比雪夫距離、標準化歐式距離、漢明距離、夾角余弦等常用距離函數&#xff1a;歐式距離、馬氏距離、曼哈頓距離…

Python(20)-高級數據類型的公共方法

高級數據類型的公共方法1內置函數2高級數據類型切片3運算符&#xff0c;*&#xff0c;in4完整的for循環公共方法是列表&#xff0c;元組&#xff0c;字典&#xff0c;字符串都能使用的方法1內置函數 內置函數&#xff1a;不需要import導入模塊&#xff0c;就可以直接使用的函數…

redis——為什么選擇了跳表而不是紅黑樹?

跳表是個啥東西請看這個文章。 我們知道&#xff0c;節點插入時隨機出一個層數&#xff0c;僅僅依靠一個簡單的隨機數操作而構建出來的多層鏈表結構&#xff0c;能保證它有一個良好的查找性能嗎&#xff1f;為了回答這個疑問&#xff0c;我們需要分析skiplist的統計性能。 在…

機器學習公式推導

文章目錄線性回歸邏輯回歸線性判別分析PCAk-means決策樹svm隨機深林GBDTxgboost強化學習MapReduce線性回歸 邏輯回歸 對于分類問題&#xff1a;輸出0/1&#xff0c;超過[0,1]沒有意義&#xff0c;使用sigmoid函數 **代價函數&#xff1a;**使用L2平方差&#xff0c;由于模型函…

Python綜合應用(1)--名片管理系統開發

第一個綜合應用-名片管理系統1框架搭建2完善功能綜合應用&#xff0c;名片管理系統 歡迎界面&#xff0c;不同選項&#xff0c;1.新建名片&#xff0c;2.顯示全部&#xff0c;3 查詢名片&#xff08;查到之后可以修改名片信息&#xff09;&#xff0c;0 退出系統 程序開發流程…

springboot1——spring相關入門

spring 隨著我們開發&#xff0c;發現了一個問題&#xff1a; A---->B---->C---->D 在A中創建B的對象調用B的資源 在B中創建C的對象調用C的資源 在C中創建D的對象調用…

大數據學習(06)-- 云數據庫

文章目錄目錄1.什么是云數據庫&#xff1f;1.1 云計算和云數據庫的關系1.2 云數據庫的概念1.3 云數據庫的特性1.4 云數據庫應用場景1.5 云數據庫和其他數據的關系2.云數據庫產品有哪些&#xff1f;2.1 云數據庫廠商概述2.2 亞馬遜云數據庫產品2.3 Google云數據庫產品2.4 微軟云…

Python(21)--變量進階

變量的進階使用1變量引用2可變、不可變數據類型3局部變量和全局變量4.Tips本系列博文來自學習《Python基礎視頻教程》筆記整理&#xff0c;視屏教程連接地址&#xff1a;http://yun.itheima.com/course/273.html在博文&#xff1a;https://blog.csdn.net/sinat_40624829/articl…

HTTP 響應代碼全集

HTTP 響應狀態代碼指示特定 http 請求是否已成功完成。響應分為五類&#xff1a;信息響應(100–199)&#xff0c;成功響應(200–299)&#xff0c;重定向(300–399)&#xff0c;客戶端錯誤(400–499)和服務器錯誤 (500–599)。狀態代碼由 section 10 of RFC 2616定義 信息響應 …

機器學習知識總結系列-機器學習中的數學-矩陣(1-3-2)

矩陣 SVD 矩陣的乘法狀態轉移矩陣狀態轉移矩陣特征值和特征向量 對稱陣 正交陣 正定陣數據白化矩陣求導 向量對向量求導 標量對向量求導 標量對矩陣求導一.矩陣1.1 SVD奇異值分解&#xff08;Singular Value Decomposition&#xff09;&#xff0c;假設A是一個mn階矩陣&#xf…

阿里Java編程規約(注釋)提煉

【強制】類、類屬性、類方法的注釋必須使用 Javadoc 規范&#xff0c;使用/**內容*/格式&#xff0c;不得使用 // xxx 方式。 說明&#xff1a;在 IDE 編輯窗口中&#xff0c;Javadoc 方式會提示相關注釋&#xff0c;生成 Javadoc 可以正確輸出相應注釋&#xff1b;在 IDE 中…

Python面試題-交換兩個數字的三種方法

Python實現兩個數字交換解法1解法2解法3a6 b100 解法1 使用其他變量&#xff0c;最通用的方法 ca ab bc 解法2 不使用其他變量,利算法節省內存空間 aab ba-b aa-b 解法3 python 專有 a,b(b,a) #等號右邊是一個元組 或者可以寫為&#xff1a; a,bb,a print(a,b)

面試中海量數據處理總結

教你如何迅速秒殺掉&#xff1a;99%的海量數據處理面試題 前言 一般而言&#xff0c;標題含有“秒殺”&#xff0c;“99%”&#xff0c;“史上最全/最強”等詞匯的往往都脫不了嘩眾取寵之嫌&#xff0c;但進一步來講&#xff0c;如果讀者讀罷此文&#xff0c;卻無任何收獲&…