【编程思想】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;
    }


}

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