1. 程式人生 > >阿裏 Java 手冊系列教程:為啥強制子類、父類變量名不同?

阿裏 Java 手冊系列教程:為啥強制子類、父類變量名不同?

會有 局部變量 寫法 boolean 實例 lean 示例 控制 多層嵌套

摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關註和轉載,保留摘要,謝謝!

目錄

  1. 父子類變量名相同會咋樣?
  2. 為啥強制子類、父類變量名不同?
  3. 可落地項目小思考

一、父子類變量名相同會咋樣?

有個小故事,今天群裏面有個人問下面如圖輸出什麽?

技術分享圖片

我回答:60。但這是錯的,答案結果是 40 。我知錯能改,然後說了下父子類變量不建議同一個名稱。

可見,父子變量名相同會令人 “Confusing”。再舉個例子,新建 ParentClass 類:

public class ParentClass {
    public String name = "parent";

    public static void main(String[] args) {
        ParentClass parentClass = new SonClass();
        SonClass sonClass = new SonClass();

        System.out.println("parentClass.name = " + parentClass.name);
        System.out.println("sonClass.name = " + sonClass.name);
        System.out.println("debug...");
    }
}

class SonClass extends ParentClass {
    public String name = "son";
}

上面如果答對的,這個肯定知道結果。運行程序打印如下:

parentClass.name = parent
sonClass.name = son
debug...

斷點到 System.out.println("debug..."); 該行,debug 下如圖:

技術分享圖片

debug 後,答案顯然:

  • 前面兩行,new 出來兩個不同 SonClass 實例
  • 每個實例都會有子類的成員變量以及父類的成員變量,這個叫做實例變量
  • 如果是 String 的值,都會指向 JVM 常量池。所以看出 sonparent 兩個 String 的對應指針數一樣,一個為 440/一個為 439

這就引出了變量的知識點,如手工畫的圖:

技術分享圖片

二、為啥強制子類、父類變量名不同?

阿裏巴巴 Java 手冊是這樣寫的:

【強制】避免在子父類的成員變量之間或者不同代碼塊的局部變量之間采用完全相同的命名方式,那會導致代碼可讀性降低。

說明:子類、父類成員變量名相同,即使屬性是 public 也是能通過編譯,雖然局部變量不在同一方法內的不同代碼中同名也是合法的,但避免使用。 setter / getter 的參數名稱也避免成員變量名相同。

具體的反例我也不寫了。為啥強制,顯而易見有幾點:

  • 可以提高代碼可讀性
    • 減少新人看代碼時不必要的困惑
    • 減少重構時不必要的困惑
    • ...
  • 多次使用能值出同源

正確的例子 ParentClass 類:

public class ParentClass {
    public String parentName = "parent";

    public static void main(String[] args) {
        ParentClass parentClass = new SonClass();
        SonClass sonClass = new SonClass();

        System.out.println("parentClass.parentName = " + parentClass.parentName);
        System.out.println("sonClass.sonName = " + sonClass.sonName);
        System.out.println("debug...");
    }
}

class SonClass extends ParentClass {
    public String sonName = "son";
}

兩種寫法的優缺點,一目了然。

三、可落地小總結

這裏是說了一種代碼風格,類似味道。本身不影響程序運行,沒有所謂的潛在故障和錯誤。那麽味道的好處總會能體驗到。
* 比如這裏談到繼承,OOP 講究:高內聚,低耦合;多組合,少繼承。比如控制語句,推薦多層嵌套不超過 3 層。那繼承也一樣:推薦繼承關系不超過 3 層。
* 還有 Boolean 成員變量定義,命名不要加 is 前綴。不然 getter 方法會少了 is,部分解析會引起序列化問題。我的做法:在設計數據庫表字段的時候,不考慮 Boolean ,用 Byte 類型去處理。這樣 is 不 is 就不 care 了。
* ...

好的命名規約,好的編碼風格,簡捷清爽,引出無限風光

代碼示例

本文示例讀者可以通過查看下面倉庫的中的 alibaba/java/ParentClass.java :

  • Github:https://github.com/JeffLi1993/java-core-learning-example
  • Gitee:https://gitee.com/jeff1993/java-core-learning-example

如果您對這些感興趣,歡迎 star、follow、收藏、轉發給予支持!

參考資料

  • 阿裏 Java 手冊系列教程:https://www.bysocket.com/archives/2100
  • 《阿裏巴巴 Java 開發手冊》

以下專題教程也許您會有興趣

  • 《Spring Boot 2.x 系列教程》
  • 《Java 核心系列教程》
技術分享圖片
(關註微信公眾號,領取 Java 精選幹貨學習資料)

阿裏 Java 手冊系列教程:為啥強制子類、父類變量名不同?