编写高质量代码-改善java程序的151个建议-第一章 01

1.不要在常量和变量中出现容易混淆的字母

准则: 包名全小写,类名首字母大写,常量全大写并使用下划线分割,变量首字母小写并侧用驼峰形式,变量和常量的值中不能出现容易混淆的字母。

我们需要遵循上面准则外,还需要注意变量和常量的值中出现容易混淆的字母,比如1l,2O,在程序中我们很难辨别出其正确值。我们可以使用1L代替1l,2O //八进制的2 代替2O,一个准则:不要让程序出现让人难以读明白的代码。

2.不要让常量蜕变为变量

准则: 常量的值需要在编译时就确定。

看下面的例子

public class Client{
  public static void main(String[] args){
    System.out.println(Const.RAND_CONST);
  }
}
interface Const{
  //此时的常量值在每次运行时都不一样,该常量的值为运行时确定
  public static final int RAND_CONST = new Random().nextInt();
}

3.三元操作符的类型必须一致

准则:保证三元操作符的两个操作数类型一致

看下面的程序

public class Client{
  public static void main(String[] args){
    int i=8;
    String s = String.valueOf(i<10?8:10);
    String s1 = String.valueOf(i<10?8:10.0);
    //print false here
    System.out.println(s.equals(s1));
  }
}

为什么是false呢,三元运算符在运算过程中会转化为操作数中最大的类型,如果两个类型不可以转化,则两个操作数都转为Object类型。

4.避免带有变长参数的方法重载【一个非变长,一个变长】

准则:避免带有变长参数的方法重载

变长参数是方法的最后一个参数,且一个方法只能支持一个变长参数。

public class Client{


   public void calPrice(int price, int discount){
       float knowndownPrice = price * discount /100.0f;
       System.out.println("simple discount: " + formatCurrency(knowndownPrice));
   }

   public void calPrice(int price, int...discounts){
       float knowndownPrice = price;
       for(int discount: discounts){
         knowndownPrice  = knowndownPrice * discount;
       }
       System.out.println("complex discount: " + formatCurrency(knowndownPrice));
   }

   public String formatCurrency(float price){
     return NumberFormat.getCurrencyInstance().format(price/100);
   }

   public static void main(String[] args){
      Client client = new Client();

      //此时会打印simple discount: $50.00
      client.calPrice(10000, 50);
   }
}

为什么上面的程序输出的不是comple discount: $50.0呢? 对于java编译器来说,它会找类型最为匹配的方法进行调用。 此时传入的50是int,所以会调用calPrice(int price, int discount)。在实际项目中尽量少用这种重载方式,代码可读性差。

5.别让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);
  }
}

上例中我们在调用methodA时,最后两行分别传入空值和null值,这是编译器就晕了,两个方法都匹配,因此会报错。因此针对这种情形,不要传入空置和null。要传入一个类型确定的null,可以这样调用:client.methodA("China",(String)null)。

转载于:https://my.oschina.net/javastorm/blog/1541024

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值