编写高质量代码:改善java程序的151个建议(1~10)

建议一:不要在常量和变量中出现易混淆的字母

包名全小写,类名首字母大写,常量全部大写且用下划线分割,变量采用驼峰命名法。

字母“l”和“O”必须标注,以示区分。

字母“l”作为长整型标志时必须大写。

建议二:莫让常量蜕变为变量

public class test {
    public static void main(String[] args) {
        long i = 1L;
        System.out.println(Const.RAND_CONST);
    }

    interface Const {
        public static final int RAND_CONST = new Random().nextInt();
    }
}

常量就是常量,不要为常量附上随机数。

建议三:三元操作符的类型务必一致

三元操作符是if-else的简化写法

public class test {
    public static void main(String[] args) {
        int i =80;
        String a = String.valueOf(i<100?90:100);
        String b = String.valueOf(i<100?90:100.0);
        System.out.println("两者是否相同"+a.equals(b));
    }
}

三元操作符会自动转换两个操作符的类型相同,不能强转时返回Object。

建议四:避免带有变长参数的方法重载

public class Client {
    /**
     * 简单折扣计算
     *
     * @param price
     * @param discount
     */
    public void calPrice(int price, int discount) {
        float knockdownPrice = price * discount / 100.0F;
        System.out.println("简单折扣后的价格是: " + formateCurrency(knockdownPrice));
    }

    /**
     * 复杂折扣计算:折上折
     *
     * @param price
     * @param discounts
     */
    public void calPrice(int price, int... discounts) {
        float knockdownPrice = price * 2;
        for (int discount : discounts) {
            knockdownPrice = knockdownPrice * discount / 100;
        }
        System.out.println("复杂折扣运算后的价格是: " + formateCurrency(knockdownPrice));
    }

    /**
     * 格式化成本的货币形式
     *
     * @param price
     * @return
     */
    private String formateCurrency(float price) {
        return NumberFormat.getCurrencyInstance().format(price / 100);
    }

    public static void main(String[] args) {
        Client client = new Client();
        client.calPrice(49900, 75);
    }
}

当传入的参数为(49900,75)时,调用了第一个方法,而不是第二个方法,重载变长参数时,会使编译器无法判断应调用哪个方法,只能根据默认的调用。

建议五:别让null值和空值威胁到变长方法

public class Client {
    public void methodA(String str, Integer... is){};
    public void methodA(String str, String... strs){};

    public static void main(String[] args) {
        Client client = new Client();
        client.methodA("China", 0);
        client.methodA("China","people");
        client.methodA("China");
        client.methodA("China", null);
    }
}
client.methodA("China");
client.methodA("China", null);

这两个方法会报错,编辑器不知道调用哪个方法。应当给null和空值定义一个类型。

不能直接定义空值,只能定义String或Integer为null。

建议六:覆写变长方法也要循规蹈矩

public class Client {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 向上转型
        Base base = new Sub();
        base.print("hello");

        // 不转型
        Sub sub = new Sub();
        sub.print("hello");
    }

}

// 基类
class Base {
    void print(String... args) {
        System.out.println("Base......test");
    }
}

// 子类,覆写父类方法
class Sub extends Base {
    @Override
    void print(String[] args) {
        System.out.println("Sub......test");
    }
}

编译不通过:第一个方法通过,第二个方法不通过。

原因:第一个方法向上转型,形参由父类决定,第二个方法子类直接调用时参数列表不匹配也不会到父类中找,所以出错。

建议七:警惕自增的陷阱

public class Client {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 10; i++) {
            count = count++;
        }
        System.out.println("count = " + count);
    }
}

结果:count = 0

注意count++,count = count++,count= ++count的区别

建议八:不要让旧语法困扰你

public class Client {
    public static void main(String[] args) {
        int fee = 100;
        saveDefault:save(fee);
    }
    static void saveDefault(){};
    static void save(int fee){};
}

java抛弃了goto语法,但仍保留着该关键字以及const关键字,只是不做处理而已。旧语法尽量少用。

建议九:少用静态导入

public class Client {
    /**
     * 计算圆面积,不使用静态导入
     *
     * @param r
     * @return
     */
    public static double calCircleArea(double r) {
        return PI * r * r;
    }

    /**
     * 计算求面积,使用静态导入
     *
     * @param r
     * @return
     */
    public static double calBallArea(double r) {
        return 4 * PI * r * r;
    }
}
静态导入的作用是将Math类中的PI常量引入到本类中,使程序更加简单。但滥用静态导入会使程序不容易读,不知道该方法来自于那个类。

建议十:不要在本类中覆盖静态导入的变量和方法

public class Client {
//    常量名与静态导入的PI相同
    public final static String PI = "祖冲之";

//    方法名与静态导入的相同
    public static int abs(int abs) {
        return 0;
    }

    public static void main(String[] args) {
        System.out.println("PI = "+PI);
        System.out.println("abs(100) = " +abs(100));
    }
}
容易搞混该方法是否是属于那个类的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值