【編程思想】02 編寫高質量代碼、Java 開發中通用的方法和準則

6、【建議】:覆寫變長方法也循規蹈矩

  1. 子類覆寫父類的方法

a: 可以修改bug、提供擴展的業務功能支持

b: 符合開閉原則

  1. 滿足條件

a: 重寫方法不能縮小訪問權限

b: 參數列表必須與被重寫方法相同

c:返回類型必須與被重寫方法的相同或是其子類

d: 重寫方法不能拋出新的異常,或者超出父類範圍的異常,但是可以拋出更少、更有限的異常,或者不拋出異常。

  1. 參數列表相同(參數數量相同、類型相同、順序相同)
  1. 代碼案例
package com.hao.test;

/**
 * @author haoxiansheng
 */
public class Test4 {
    public static void main(String[] args) {
        // 向上轉型
        Base base = new Sub();
        base.fun(100, 50);
        // 不轉型
        Sub sub = new Sub();
        sub.fun(100, 50);

    }
}

class Base {
    void fun (int price, int [] discounts) {
        System.out.println(",,,,");
    }
}

//  子類,覆寫父類方法
class Sub extends Base {
    @Override
    void fun(int price, int... discounts) {
        System.out.println("...");
    }
}

  1. 覆寫的方法參數與父類相同,不僅僅是類型、數量,還包括顯示形式

7、【建議】:警惕自增的陷阱

  1. 代碼
package com.hao.test;

import lombok.extern.slf4j.Slf4j;

/**
 * @author haoxiansheng
 */
@Slf4j
public class Test5 {
    public static void main(String[] args) {
        int count = 1;
        int sum = 50;
        for (int i = 0; i < 10; i++) {
            count = count++;
        }
        log.info("count=>{}", count);

        for (int i = 0; i < 100; i++) {
            count = count++;
            sum = count * 50;
        }
        log.info("sum=>{}", sum);

        for (int i = 0; i < 100; i++) {
            count++;
            sum = count * 50;
        }
        log.info("sum=>{}", sum);
    }
}

  1. count++是一個表達式,是有返回值的,它的返回值就是count自加前的值,Java對自加是這樣處理的:首先把count的值(注意是值,不是引用)拷貝到一個臨時變量區,然後對count變量加1,最後返回臨時變量區的值。
  1. java 中 “count=count++” 理解
    public static int mockAdd(int count) {
        // 先保存初始值
        int temp = count;
        // 做自增操作
        count = count +1;
        // 返回原始值
        return temp;
    }

步驟1 JVM把count值(其值是0)拷貝到臨時變量區。

步驟2 count值加1,這時候count的值是1。

步驟3 返回臨時變量區的值,注意這個值是0,沒修改過。

步驟4 返回值賦值給count,此時count值被重置成0。

8、【建議】:不要讓舊語法困擾你

  1. 代碼跳轉 拋棄舊的語法
package com.hao.test;

import lombok.extern.slf4j.Slf4j;

/**
 * @author haoxiansheng
 */
@Slf4j
public class Test6 {
    public static void main(String[] args) {
        // 數據定義及初始化
        int fee = 200;
        // 其他業務處理
        saveDefault:save(fee);

    }
    public static void saveDefault() {

    }

    public static void save(int fee) {
        log.info("fee=>{}",fee);
    }

}

9、【建議】:少用靜態導入

  1. 優缺點

a優點: 減少了代碼量,而且代碼的可讀性也提高了,這也是靜態導入用到正確地方所帶來的好處。

b缺點: 缺少了類名的修飾,靜態屬性和靜態方法的表象意義可以被無限放大,這會讓閱讀者很難弄清楚其屬性或方法代表何意,甚至是哪一個類的屬性(方法)都要思考一番。

  1. 導入原則

a: 不使用*(星號)通配符,除非是導入靜態常量類(只包含常量的類或接口)。

b: 方法名是具有明確、清晰表象意義的工具類

10、【建議】:不要在本類中覆蓋靜態導入的變量和方法

  1. 如果一個類中的方法及屬性與靜態導入的方法及屬性重名會出現引用本地的屬性或者方法。不會用靜態導入的==>【編譯器“最短路徑”原則】
  1. 代碼
package com.hao.test;
import lombok.extern.slf4j.Slf4j;

import static java.lang.Math.PI;
import static java.lang.Math.abs;
/**
 * @author haoxiansheng
 */
@Slf4j
public class Test7 {
    // 常量名與靜態導入的PI相同
    private final static String PI ="祖沖之";
    // 方法名與靜態導入的相同
    public static void main(String[] args) {
        log.info("PI=>{}",PI);
        log.info("abs=>{}",abs(100));
    }

    public final static int abs(int abs) {
        return 0;
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章