阿里java開發手冊
A. 關於java學習,有什麼書籍或者教程推薦不啦
java Netty實戰課程java高性能分布式RPC教程課程 免費下載
鏈接:https://pan..com/s/1MpUM62h4nvHnUGMan-R6YA
Java是一門面向對象的編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程
B. 阿里巴巴開發手冊(list集合操作)
1、不允許程序任何地方使用java.sql.Date、java.sql.Time 、java.sql.Timestamp。
2、判斷list元素是否為空,使用isEmpty()方法,而不是size()==0。
3、集合轉數組,必須使用集合和羨的toArray(T[] array),傳入的是類型完團掘全一致、長度0的空數組
說明:如果直接使用toArray無參方法存在問題,只能返喚或拍回object[]類,若強制轉其他數組類型出現ClassCastException異常
使用 toArray 帶參方法,數組空間大小的 length,
1) 等於 0,動態創建與 size 相同的數組,性能最好2)
2)大於 0 但小於 size,重新創建大小等於 size 的數組,增加 GC 負擔。
3) 等於 size,在高並發情況下,數組創建完成之後,size 正在變大的情況下,負面影響與 2 相同。
4) 大於 size,空間浪費,且在 size 處插入 null 值,存在 NPE 隱患。
4、集合初始化時,指定集合初始值大小
說明:如果暫時無法確定集合大小,指定默認值(16)即可。
5、變數map使用entrySet而不是keySet。
說明:KeySet其實變數了2次,一次轉為Iterator對象,另一次從hashMap中取出key對應的value。
如果jdk8使用Map.forEach()方法
6、Map類集合k/v能不能存儲null值,表格
C. 為什麼阿里禁止使用存儲過程為什麼阿里巴巴Java開發手冊里禁止使用存儲過程
1、這是針對互聯網企業的信灶規則。單次請求涉及數據少,數據關系簡單,但是更新頻率高;
2、工程的迭代速率高,數據關系隨時可滑鄭扮能擴展修改。ERP開發面對的情況是經常要大批量的處理數據,表都很大,表關系也復雜,十幾個表關聯不是什麼大不了的情況。數據處理流程長,不用存儲過程只會讓叢虛事情更加復雜。
3、ERP中對資料庫請求量相比互聯網企業來說是非常低的,相對不用太關心資料庫壓力問題,這種時候把一些操作放到數據存儲過程里可以兼顧效率和開發成本。
D. 為什麼阿里巴巴Java開發手冊里要求禁止使用存儲過程
這個手冊應該是開發人員寫的,而開發人員與DBA之間永遠有無法逾越的鴻溝。比如開發人員認為O和R可以mapping,可是在DBA看來建模方法都不一樣如何mapping?
手冊說存儲過程難以調試。應該是對於開發人員來說難以調試。
E. 阿里強制使用SLF4J日誌框架的緣由
想必小夥伴們都用過日誌,雖然日誌看起來可有可無,但是等到出問題的時候,就比較棘手。所以說日誌框架使用好不好,規范不規范,直接影響了解決生產環境故障的效率,日誌框架選的不好、用的不好,有可能影響環境的性能,也有可能影響排查問題的難易程度。
阿里Java開發手冊--日誌規約第一條:
【強制】應用中不可直接使用日誌系統(Log4j、Logback)中的 API,而應讓顫依賴使用日誌框架 SLF4J 中的 API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。
代碼樣例:
為坦搜敗什麼會有此規范呢?我們先來了解下日誌框架。
Java中的日誌框架分如下幾種:
重點來看下Slf4j的官方說明
為什麼阿里要強制 依賴使用日誌框架 SLF4J 中的 API 或者說Slf4j的特點: 除了得益於面向介面編程(使用了門面模式),還有一個特性支持佔位符,以及SELF4J的生態(SLF4J與其他日誌組件的橋接)
門面(Facade)模式,對外隱藏了系統的復雜性,並向客戶端提供了可以訪問的介面,門面模式的好處是將客戶端和子系統松耦合,方便子系統的擴展和維護。
正是門面模式這樣的特點,使用SLF4J門面,不管日誌組件使用的是log4j還是logback等等,對於調用者而言並不關心使用的是什麼日誌組件,而且對於日誌組件的更換或者升級,調用的地方也不用做任何修改。
SLF4J中有一個重要的特性:佔位符,{}可以拼接任意字元串,相比如其他框架的優點即不需要用+來拼接字元串,也就不會創建新的字元串對象。
使用注意點:
小貼士:
在發布SDK或服務框架時,要遵漏伍循 面向介面編程的思想 ,不要把SLF4J實現類進行發布向下傳遞,SLF4J實現類可以通過maven的scope來控制不進行向下傳遞。
以上是使用SLF4J的緣由和注意點的說明。
Slf4j Manual中有一張圖清晰的展示了接入方式,如下:
slf4j bound to 其它log框架
slf4j bound to log redirection
在使用slf4j橋接時要注意避免形成死循環,在項目依賴的jar包中不要存在以下情況
想要更好的了解SLF4J,你需要了解JVM類載入機制
設計模式:門面模式、橋接模式。源碼解析過程這里忽略。
F. 阿里巴巴 java 開發手冊 do放在哪個包下
common層的do包下就行,沒有強制要求
G. 阿里java類行數
阿里鉛肢java類行數是80行以內。java開發手冊推薦單個方法的總行數不超過80行。除注釋之外的方槐螞世法簽名、左右大括弧、方法內代碼、空行、回車物源及任何不可見字元的總行數不超過80行。
H. 如何評價《阿里巴巴 JAVA 開發手冊》
阿里巴巴集團推出的《阿里巴巴 Java 開發手橘殲殲冊(正式版改裂)》是阿里巴巴近萬名開發同學集體智慧的結晶,以開發視角為中心,詳細列舉如何開發更加高效、更加容錯、更加有協作性,力求知其然,更知其不然,結合正反例,讓 Java 開發者能圓沖夠提升協作效率、提高代碼質量。
I. 開發手冊在什麼階段用
開發手冊在供大家在交流、學習及研究階段使用,禁止用於商業銀銀用途。
《阿里巴巴Java 開發手冊》是阿里巴巴集團技術團隊的集體經驗總結,經歷了多次大規模一線實戰的檢驗及不斷的完善,反饋給廣大開發者。現代軟體行業的高速鋒彎宴發展對開發者的綜合素質要求越來越高,因為不僅是編程知識點,其它維度的知識點也會影響到軟體的最終交付質量。比如:資料庫的表結構和索引設計缺陷可能帶來軟體上的架構缺陷或性能風險;工程結構混亂導致後續維護艱難;沒有鑒權的漏洞代碼易被黑客攻擊等等。所以本手冊以 Java 開發者為中心視角,劃分為編程規約、異常日誌、MySQL 資料庫、工程結構、安全規約五大塊,再根據內容特徵,細分成若干二級子目錄。根據約束力強弱及故障敏感性,規約依次分為強制、推薦、參考三大類。對於規約條目的延伸信息中,「說明」對內容做了引申和解釋;「正例」提倡什麼樣的編碼和實現方式;「反例」說明需要提防的雷區,以及真實的錯誤案例。
本手冊的願景是碼出高效、碼出質量。代碼的字里行間流淌的是軟體生命中的血液,質量的提升是盡可能少踩坑,杜絕踩重復的坑,切實提升質量意識。另外,現代軟體架構都需要協同開發完成,高效協作即降低協同成本,提升溝通效率,所謂無規矩不成方圓,無規范不能協作。眾所周知,制訂交通法規表面上是要限制行車權,實際上是保障公眾的人身安全。試想如果沒有限速,沒有紅綠燈,誰還敢上路行駛。對軟體來鬧悉說,適當的規范和標准絕不是消滅代碼內容的創造性、優雅性,而是限制過度個性化,以一種普遍認可的統一方式一起做事,提升協作效率。
J. 為什麼阿里工程師代碼寫的好看看他的代碼規范就知道了
曾經與一位從阿里出來的Java工程師一起工作過一段時間,他的技術說不上非常厲害, 但是,他的代碼寫的的非常好,凡是他做的功能很少出現Bug 。我就很好奇,於是經常向他請教一些代碼設計的原則,然後他告訴了我阿里Java手冊。並且,他將這個手冊進行了修改,也成為了我司Java程序員的開發手冊。 這篇文章就讓我們看一看這個手冊中比較重要的原則。
【強制】 代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。
反例:_name / __name / $name / name_ / name$ / name__
【強制】 類型與中括弧緊挨相連來表示數組。
正例:定義整形數組 int[] arrayDemo; 反例:在 main 參數中,使用 String args[]來定義。
【強制】 POJO 類中布爾類型變數都不要加 is 前綴,否則部分框架解析會引起序列化錯誤。
說明:表達是與否的值採用 is_xxx 的命名方式,所以,需要在 設置從 is_xxx 到 xxx 的映射關系。
反例:定義為基本數據類型 Boolean isDeleted 的屬性,它的方法也是 isDeleted(), RPC 框架在反向解 析的時候,「誤以為」對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異常。
【推薦】 在常量與變數的命名時,表示類型的名詞放在詞尾,以提升辨識度。
【推薦】 介面類中的方法和屬性不要加任何修飾符號(public 也不要加),保持代碼的簡潔 性,並加上有效的 Javadoc 注釋。盡量不要在介面里定義變數,如果一定要定義變數,肯定 是與介面方法相關,並且是整個應用的基礎常量。
正例:介面方法簽名 void commit();
介面基礎常量 String COMPANY = "alibaba";
反例:介面方法定義 public abstract void f();
說明:JDK8 中介面允許有默認實現,那麼這個 default 方法,是對所有實現類都有價值的默認實現。
【參考】 枚舉類名帶上 Enum 後綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。
說明:枚舉其實就是特殊的類,域成員均為常量,且構造方法被默認強制是私有。
正例:枚舉名字為 ProcessStatusEnum 的成員名稱:SUCCESS / UNKNOWN_REASON。
【參考】 各層命名規約:
1) 獲取單個對象的方法用 get 做前綴。
2) 獲取多個對象的方法用 list 做前綴,復數形式結尾如:listObjects。 3) 獲取統計值的方法用 count 做前綴。
4) 插入的方法用 save/insert 做前綴。
5) 刪除的方法用 remove/delete 做前綴。
6) 修改的方法用 update 做前綴。
1) 數據對象:xxxDO,xxx 即為數據表名。
2) 數據傳輸對象:xxxDTO,xxx 為業務領域相關的名稱。
3) 展示對象:xxxVO,xxx 一般為網頁名稱。
4) POJO 是 DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO。
【強制】 不允許任何魔法值(即未經預先定義的常量)直接出現在代碼中。
【強制】 避免通過一個類的對象引用訪問此類的靜態變數或靜態方法,無謂增加編譯器解析 成本,直接用類名來訪問即可。
【強制】 相同參數類型,相同業務含義,才可以使用Java的可變參數,避免使用Object。
說明:可變參數必須放置在參數列表的最後。(提倡同學們盡量不用可變參數編程)
【強制】 所有整型包裝類對象之間值的比較,全部使用equals方法比較。
說明:對於 Integer var = ? 在-128 至 127 范圍內的賦值,Integer 對象是在 IntegerCache.cache 產 生,會復用已有對象,這個區間內的 Integer 值可以直接使用==進行判斷,但是這個區間之外的所有數 據,都會在堆上產生,並不會復用已有對象,這是一個大坑,推薦使用 equals 方法進行判斷。
關於基本數據類型與包裝數據類型的使用標准如下:
說明: POJO 類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值 ,任何 NPE 問題,或 者入庫檢查,都由使用者來保證。
正例:資料庫的查詢結果可能是 null,因為自動拆箱,用基本數據類型接收有 NPE 風險。
反例: 比如顯示成交總額漲跌情況,即正負 x%,x 為基本數據類型,調用的 RPC 服務,調用不成功時, 返回的是默認值,頁面顯示為 0%,這是不合理的,應該顯示成中劃線 。所以包裝數據類型的 null 值,能 夠表示額外的信息,如:遠程調用失敗,異常退出。
【強制】 POJO 類必須寫 toString 方法。
使用 IDE 中的工具:source> generate toString 時,如果繼承了另一個 POJO 類,注意在前面加一下 super.toString。
說明: 在方法執行拋出異常時,可以直接調用 POJO 的 toString()方法列印其屬性值,便於排查問題。
【強制】 關於hashCode和equals的處理,遵循如下規則:
說明:String 已覆寫 hashCode 和 equals 方法,所以我們可以愉快地使用 String 對象作為 key 來使用。
【強制】 線程資源必須通過線程池提供,不允許在應用中自行顯式創建線程。
說明:線程池的好處是減少在創建和銷毀線程上所消耗的時間以及系統資源的開銷,解決資源不足的問 題。 如果不使用線程池,有可能造成系統創建大量同類線程而導致消耗完內存或者「過度切換」的問題。
【強制】 線程池不允許使用Executors去創建,而是通過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險。
以上規范在設計代碼中,是比較重要的原則。如果編寫代碼的過程中,可以依照以上原則,那代碼的可讀性和可維護性將大大提升