Java編程規約(OOP)

1、【強制】避免通過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增加編譯器解析

成本,直接用類名來訪問即可。

2、【強制】所有的覆寫方法,必須加@Override 注解。

說明:getObject() get0bject()的問題。一個是字母的 O,一個是數字的 0,加@Override 可以準確判

斷是否覆蓋成功。另外,如果在抽象類中對方法簽名進行修改,其實現類會馬上編譯報錯。

3、【強制】相同參數類型,相同業務含義,才可以使用 Java 的可變參數,避免使用 Object

說明:可變參數必須放置在參數列表的最后。(提倡同學們盡量不用可變參數編程)

正例:public List<User> listUsers(String type, Long... ids) {...}

4、【強制】外部正在調用或者二方庫依賴的接口,不允許修改方法簽名,避免對接口調用方產

生影響。接口過時必須加@Deprecated 注解,并清晰地說明采用的新接口或者新服務是什

么。

5、【強制】不能使用過時的類或方法。

說明:java.net.URLDecoder 中的方法 decode(String encodeStr) 這個方法已經過時,應該使用雙參數

decode(String source, String encode)。接口提供方既然明確是過時接口,那么有義務同時提供新的接

口;作為調用方來說,有義務去考證過時方法的新實現是什么。

6、【強制】Object equals 方法容易拋空指針異常,應使用常量或確定有值的對象來調用

equals

正例:"test".equals(object);

反例:object.equals("test");

說明:推薦使用 java.util.Objects#equalsJDK7 引入的工具類)。

7、【強制】所有整型包裝類對象之間值的比較,全部使用 equals 方法比較。

說明:對于 Integer var = ? -128 127 范圍內的賦值,Integer 對象是在 IntegerCache.cache

生,會復用已有對象,這個區間內的 Integer 值可以直接使用==進行判斷,但是這個區間之外的所有數

據,都會在堆上產生,并不會復用已有對象,這是一個大坑,推薦使用 equals 方法進行判斷。

8、【強制】浮點數之間的等值判斷,基本數據類型不能用==來比較,包裝數據類型不能用

equals 來判斷。

說明:浮點數采用尾數+階碼的編碼方式,類似于科學計數法的有效數字+指數的表示方式。二進制無法精確表示大部分的十進制小數。

反例:
float a = 1.0f - 0.9f; float b = 0.9f - 0.8f;
if (a == b) {
// 預期進入此代碼快,執行其它業務邏輯 // 但事實上 a==b的結果為 false
}
Float x = Float.valueOf(a);?
Float y = Float.valueOf(b);?
if (x.equals(y)) {
// 預期進入此代碼快,執行其它業務邏輯 // 但事實上 equals的結果為 false
}
?

正例:
(1) 指定一個誤差范圍,兩個浮點數的差值在此范圍之內,則認為是相等的。
float a = 1.0f - 0.9f; float b = 0.9f - 0.8f; float diff = 1e-6f;
if (Math.abs(a - b) < diff) {
?System.out.println("true"); }
(2) 使用 BigDecimal 來定義值,再進行浮點數的運算操作。
BigDecimal a = new BigDecimal("1.0");

BigDecimal b = new BigDecimal("0.9");

BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b); BigDecimal y = b.subtract(c);
if (x.equals(y)) { }

9、關于基本數據類型與包裝數據類型的使用標準如下:

1 【強制】所有的 POJO 類屬性必須使用包裝數據類型。

2 【強制】RPC 方法的返回值和參數必須使用包裝數據類型。

3 【推薦】所有的局部變量使用基本數據類型。

說明:POJO 類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值,任何 NPE 問題,或

者入庫檢查,都由使用者來保證。

正例:數據庫的查詢結果可能是 null,因為自動拆箱,用基本數據類型接收有 NPE 風險。

反例:比如顯示成交總額漲跌情況,即正負 x%x 為基本數據類型,調用的 RPC 服務,調用不成功時,

返回的是默認值,頁面顯示為 0%,這是不合理的,應該顯示成中劃線。所以包裝數據類型的 null 值,能

夠表示額外的信息,如:遠程調用失敗,異常退出。

10、【強制】定義 DO/DTO/VO POJO 類時,不要設定任何屬性默認值

反例:POJO 類的 createTime 默認值為 new Date(),但是這個屬性在數據提取時并沒有置入具體值,在

更新其它字段時又附帶更新了此字段,導致創建時間被修改成當前時間。

11、【強制】序列化類新增屬性時,請不要修改 serialVersionUID 字段,避免反序列失敗;如果

完全不兼容升級,避免反序列化混亂,那么請修改 serialVersionUID 值。

說明:注意 serialVersionUID 不一致會拋出序列化運行時異常。

12、【強制】構造方法里面禁止加入任何業務邏輯,如果有初始化邏輯,請放在 init 方法中。

13、【強制】POJO 類必須寫 toString 方法。使用 IDE 中的工具:source> generate toString

時,如果繼承了另一個 POJO 類,注意在前面加一下 super.toString

說明:在方法執行拋出異常時,可以直接調用 POJO toString()方法打印其屬性值,便于排查問題。

14、【強制】禁止在 POJO 類中,同時存在對應屬性 xxx isXxx() getXxx()方法。

說明:框架在調用屬性 xxx 的提取方法時,并不能確定哪個方法一定是被優先調用到。

15、【推薦】使用索引訪問用 String split 方法得到的數組時,需做最后一個分隔符后有無內

容的檢查,否則會有拋 IndexOutOfBoundsException 的風險。

說明:

String str = "a,b,c,,"; String[] ary = str.split(",");

// 預期大于 3,結果是 3 System.out.println(ary.length);

16、【推薦】當一個類有多個構造方法,或者多個同名方法,這些方法應該按順序放置在一起,

便于閱讀,此條規則優先于下一條。

17、【推薦】 類內方法定義的順序依次是:公有方法或保護方法 > 私有方法 > getter / setter

方法。

說明:公有方法是類的調用者和維護者最關心的方法,首屏展示最好;保護方法雖然只是子類關心,也可

能是模板設計模式下的核心方法;而私有方法外部一般不需要特別關心,是一個黑盒實現;因為承載

的信息價值較低,所有 Service DAO getter/setter 方法放在類體最后。

?

18、【推薦】setter 方法中,參數名稱與類成員變量名稱一致,this.成員名 = 參數名。在

getter/setter 方法中,不要增加業務邏輯,增加排查問題的難度。

反例:

public Integer getData() {

?if (condition) {

return this.data + 100; } else {

?return this.data - 100;

}

}

19、【推薦】循環體內,字符串的連接方式,使用 StringBuilder append 方法進行擴展。

說明:下例中,反編譯出的字節碼文件顯示每次循環都會 new 出一個 StringBuilder 對象,然后進行

append 操作,最后通過 toString 方法返回 String 對象,造成內存資源浪費。

反例:

String str = "start";

for (int i = 0; i < 100; i++) {

str = str + "hello"; }

20、【推薦】final 可以聲明類、成員變量、方法、以及本地變量,下列情況使用 final 關鍵字:

1 不允許被繼承的類,如:String 類。

2 不允許修改引用的域對象。

3 不允許被覆寫的方法,如:POJO 類的 setter 方法。

4 不允許運行過程中重新賦值的局部變量。

5 避免上下文重復使用一個變量,使用 final 可以強制重新定義一個變量,方便更好地進行重構。

21、【推薦】慎用 Object clone 方法來拷貝對象。

說明:對象 clone 方法默認是淺拷貝,若想實現深拷貝需覆寫 clone 方法實現域對象的深度遍歷式拷貝。

22、【推薦】類成員與方法訪問控制從嚴:

1 如果不允許外部直接通過 new 來創建對象,那么構造方法必須是 private

2 工具類不允許有 public default 構造方法。

3 類非 static 成員變量并且與子類共享,必須是 protected

4 類非 static 成員變量并且僅在本類使用,必須是 private

5 static 成員變量如果僅在本類使用,必須是 private

6 若是 static 成員變量,考慮是否為 final

7 類成員方法只供類內部調用,必須是 private

8 類成員方法只對繼承類公開,那么限制為 protected

說明:任何類、方法、參數、變量,嚴控訪問范圍。過于寬泛的訪問范圍,不利于模塊解耦。

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

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

相關文章

深度學習(07)-- 經典CNN網絡結構(Inception (v1-v4))

文章目錄目錄1.Inception介紹1.1 Inception結構1.2 Inception V1(GoogleNet)1.3 Inception V2(Batch Norm)1.4 Inception V3&#xff08;Factorization&#xff09;1.5 Inception V4&#xff08;ResNet&#xff09;1.5 Inception v1~v4 總結1.6 Inception進階2.Inception實現目…

Python(13)-函數,lambda語句

函數1 函數定義2 函數調用3 函數注釋文檔4 函數參數4.1 參數列表,默認參數,任意參數4.1.1 無缺省值參數4.1.2&#xff08;部分&#xff09;缺省值參數4.1.3 數量不定形參數4.2 可變對象和不可變對象4.3 作用域4.3.1 globals()函數4.3.2 global 聲明變量為全局變量5 函數返回值5…

深度學習(08)-- Residual Network (ResNet)

文章目錄目錄1.殘差網絡基礎1.1基本概念1.2VGG19、ResNet34結構圖1.3 梯度彌散和網絡退化1.4 殘差塊變體1.5 ResNet模型變體1.6 Residual Network補充1.7 1*1卷積核&#xff08;補充&#xff09;2.殘差網絡介紹&#xff08;何凱明&#xff09;3.ResNet-50(Ng)3.1 非常深的神經網…

Python(14)-模塊

模塊Python標準庫&#xff0c;第三方庫都是一個個模塊&#xff0c;我們還可以編寫自己的模塊。模塊python程序架構的核心模塊&#xff0c;模塊是一個工具包。 每一個以.py為擴展名的源代碼文件都是一個模塊。 想要使用工具包中的工具&#xff0c;可以使用Import的方式導入。 …

redis——命令請求的執行過程

發送命令請求 當用戶在客戶端中鍵入一個命令請求時&#xff0c; 客戶端會將這個命令請求轉換成協議格式&#xff0c; 然后通過連接到服務器的套接字&#xff0c; 將協議格式的命令請求發送給服務器。 讀取命令請求 當客戶端與服務器之間的連接套接字因為客戶端的寫入而變得可…

深度學習(09)-- DenseNet

文章目錄目錄1.DenseNet網絡結構2.稠密連接及其優點3.代碼實現4.補充說明目錄 1.DenseNet網絡結構 2.稠密連接及其優點 每層以之前層的輸出為輸入&#xff0c;對于有L層的傳統網絡&#xff0c;一共有L個連接&#xff0c;對于DenseNet&#xff0c;則有L*(L1)/2。 這篇論文主要…

redis——緩存擊穿/穿透/雪崩

緩存穿透 一般的緩存系統&#xff0c;都是按照key去緩存查詢&#xff0c;如果不存在對應的value&#xff0c;就去后端系統查找&#xff08;比如DB&#xff09;。 一些惡意的請求會故意查詢不存在的key,請求量很大&#xff0c;就會對后端系統造成很大的壓力。這就叫做緩存穿透…

python(15)-window7配置iPython

前提&#xff1a;安裝了Pythonanaconda anaconda安裝參考&#xff1a;https://www.zhihu.com/question/58033789 在window系統下可以使用兩種方法來實現類似與于Linux終端命令運行程序的方法&#xff08;推薦方式2&#xff09;: 1.cmd:自己沒有操作過&#xff0c;可以參考下面…

深度學習(10)-- Capsules Networks(CapsNet)

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/malele4th/article/details/79430464 </div><div id"content_views" class"markdown_views"><!-- flowchart 箭頭圖標 勿刪 --&g…

手把手maven的功能/安裝/使用/idea集成

看這篇文章不用著急安裝&#xff0c;跟著步驟一定會成功&#xff0c;要理解maven是什么&#xff0c;如何使用。 介紹 maven官網 對于一個小白來說&#xff0c;官網有用的信息就是這些 不管如何介紹maven&#xff0c;作為使用者來說&#xff0c;主要感覺兩個方面有幫助&#x…

python(16)-列表list,for循環

高級數據類型--列表1列表定義2列表中取值3列表的增&#xff0c;刪&#xff0c;查&#xff0c;改3.1修改指定位置的數據3.2確定指定元素的索引3.3增加操作3.4刪除操作3.5 元素是否存在與列表中 in3.6在指定索引位置插入元素4列表的數據統計5列表排序6列表的循環遍歷-for7多維度l…

深度學習(11)-- GAN

TensorFlow &#xff08;GAN&#xff09; 目錄 TensorFlow &#xff08;GAN&#xff09;目錄1、GAN1.1 常見神經網絡形式1.2 生成網絡1.3 新手畫家 & 新手鑒賞家1.4 GAN網絡1.5 例子 1、GAN 今天我們會來說說現在最流行的一種生成網絡, 叫做 GAN, 又稱生成對抗網絡, 也…

Python外(1)--try-expect

語法&#xff1a; try:正常情況下執行的代碼塊 expect 錯誤類型1:&#xff08;可選&#xff09;錯誤類型1對應的處理方案 expect 錯誤類型2:&#xff08;可選&#xff09;錯誤類型2對應的處理方案 expect:剩下的錯誤類型對應的處理方案 else:&#xff08;可選&#xff09;沒有…

redis——數據結構和對象的使用介紹

redis官網 微軟寫的windows下的redis 我們下載第一個 額案后基本一路默認就行了 安裝后&#xff0c;服務自動啟動&#xff0c;以后也不用自動啟動。 出現這個表示我們連接上了。 redis命令參考鏈接 String 字符串結構 struct sdshdr{//記錄buf數組中已使用字節的數量int …

Python模塊(1)-Argparse 簡易使用教程

argparse 簡易使用教程1.概況2. action3. argparse 使用demo3.1 argparse 實現加法器3.2 D-Model parser1.概況 argparse是Python中用于解析命令行參數的一個模塊&#xff0c;可以自動生成help和usage信息&#xff1b;當從終端輸入的參數無效時&#xff0c;模塊會輸出提示信息…

深度學習--Keras總結

Keras主要包括14個模塊&#xff0c;本文主要對Models、layers、Initializations、Activations、Objectives、Optimizers、Preprocessing、metrics共計8個模塊分別展開介紹&#xff0c;并通過一個簡單的Bp神經網絡說明各個模塊的作用。 1. Model 包&#xff1a;keras.models …

redis——NOSQL及redis概述

NoSql入門概述 單機Mysql的美好時代 瓶頸&#xff1a; 數據庫總大小一臺機器硬盤內存放不下數據的索引&#xff08;B tree&#xff09;一個機器的運行內存放不下訪問量&#xff08;讀寫混合&#xff09;一個實例不能承受Memcached&#xff08;緩存&#xff09; MySql 垂直拆…

Python(17)-元組tuple

高級數據類型--元組1.元組的定義2.元組基本操作3.元組的循環遍歷4.元組的應用場景5.元組與格式化字符串6.元組與列表之間的轉換元組的最大特征就是可訪問不可改&#xff0c;可作為字典的鍵值&#xff0c;因為鍵值必須是唯一的。字符串也是不可邊類型&#xff0c;因此也適合做字…

深度學習(莫煩 神經網絡 lecture 3) Keras

神經網絡 & Keras 目錄 神經網絡 & Keras目錄1、Keras簡介1.1 科普: 人工神經網絡 VS 生物神經網絡1.2 什么是神經網絡 (Neural Network)1.3 神經網絡 梯度下降1.4 科普: 神經網絡的黑盒不黑1.5 Why Keras?1.6 兼容 backend 2、如何搭建各種神經網絡2.1 Regressor回歸…

阿里Java編程規約(集合)

【強制】關于 hashCode 和 equals 的處理&#xff0c;遵循如下規則&#xff1a; 1&#xff09; 只要覆寫 equals&#xff0c;就必須覆寫 hashCode。 2&#xff09; 因為 Set 存儲的是不重復的對象&#xff0c;依據 hashCode 和 equals 進行判斷&#xff0c;所以 Set 存儲的對…