建议1:
不要在常量和变量中出现容易混淆的字母:如long i = 1L,表示long类型,后面的l最好大写
建议2:
不要让常量蜕变成变量,常量应该在编译期就确定。
如:publicstatic final int RAND_CONST = new Random().nextInt();
建议3:
三元操作符的类型务必一致
如:
public class Suggest3 {
public static void main(String[] args) {
int i = 80;
String s = String.valueOf(i < 100 90 : 100);
// 100.0为float类型,返回值时,90会被自动提升为90.0,所以两个String不是同一个对象
String s1 = String.valueOf(i < 100 90 : 100.0);
System.out.println(s == s1);
/*
* 上面提到三元运算符的一个类型转换问题
* 1,若两个操作数不可转换,则不转换,返回Object
* 2,若连个数都是明确的表达式,则int转long,long转float
* */
}
}
public class Suggest3 {
public static void main(String[] args) {
int i = 80;
String s = String.valueOf(i < 100 90 : 100);
// 100.0为float类型,返回值时,90会被自动提升为90.0,所以两个String不是同一个对象
String s1 = String.valueOf(i < 100 90 : 100.0);
System.out.println(s == s1);
/*
* 上面提到三元运算符的一个类型转换问题
* 1,若两个操作数不可转换,则不转换,返回Object
* 2,若连个数都是明确的表达式,则int转long,long转float
* */
}
}
建议4:
使用变长方法时,避免带有变长参数的方法重载:
如:
public class Suggest4 {
public static void main(String[] args) {
// 执行的是简单折扣的方法,虽然多次折扣的方法也包括了改参数类型
// 最好不要用,容易引起混淆
calPrice(100, 75);
calPrice(100, 75, 80);
}
public static void calPrice(int price, int discount) {
float money = price * discount / 100.0F;
System.out.println("折扣后的价是:" + money);
}
// 方法重载 ,传入可变长参数
public static void calPrice(int price, int... discount) {
float money = price;
for (int d : discount) {
money = money * d / 100.0F;
}
System.out.println("多次折扣后的价是:" + money);
}
public class Suggest4 {
public static void main(String[] args) {
// 执行的是简单折扣的方法,虽然多次折扣的方法也包括了改参数类型
// 最好不要用,容易引起混淆
calPrice(100, 75);
calPrice(100, 75, 80);
}
public static void calPrice(int price, int discount) {
float money = price * discount / 100.0F;
System.out.println("折扣后的价是:" + money);
}
// 方法重载 ,传入可变长参数
public static void calPrice(int price, int... discount) {
float money = price;
for (int d : discount) {
money = money * d / 100.0F;
}
System.out.println("多次折扣后的价是:" + money);
}
}
建议5:
警惕自增的陷阱:
看下面这段代码
public class Suggest5 {
public static void main(String[] args) {
int count = 0;
for (int i = 0; i < 10; i++) {
// count++是一个表达式,返回count自加前的值
count = count++;
}
System.out.println(count);
}
}
public class Suggest5 {
public static void main(String[] args) {
int count = 0;
for (int i = 0; i < 10; i++) {
// count++是一个表达式,返回count自加前的值
count = count++;
}
System.out.println(count);
}
}
输出count的值是0
建议6:
避免instanceof非预期结果
/详细分析instanceof()
public class Suggest6 {
public static void main(String[] args) {
// 判断String对象是否是Object对象的实例
// true
boolean b1 = "cloud" instanceof Object;
// String对象是否是String的实例
// true
boolean b2 = new String() instanceof String;
// Object对象是否是String的实例
// false,Object是String的父类,编译可以通过
boolean b3 = new Object() instanceof String;
// 拆箱类型是否是装箱类型的实例,编译不通过,char类型是基本类型,instanceof只用于对象的判断
// boolean b4 = 'A' instanceof Character;
// 空对象是否是String的实例
// false,规则:如果左操作数是null,则直接返回false不再运算右边
boolean b5 = null instanceof String;
// 转换类型后的null是否是String类型的对象
// false,null没有类型,做类型转换后还是null
boolean b6 = (String) null instanceof String;
// Data对象是否是String对象的实例,编译不通过,Date类和String没有继承或实现关系
// boolean b7 = new Date() instanceof new String;
}
}
//详细分析instanceof()
public class Suggest6 {
public static void main(String[] args) {
// 判断String对象是否是Object对象的实例
// true
boolean b1 = "cloud" instanceof Object;
// String对象是否是String的实例
// true
boolean b2 = new String() instanceof String;
// Object对象是否是String的实例
// false,Object是String的父类,编译可以通过
boolean b3 = new Object() instanceof String;
// 拆箱类型是否是装箱类型的实例,编译不通过,char类型是基本类型,instanceof只用于对象的判断
// boolean b4 = 'A' instanceof Character;
// 空对象是否是String的实例
// false,规则:如果左操作数是null,则直接返回false不再运算右边
boolean b5 = null instanceof String;
// 转换类型后的null是否是String类型的对象
// false,null没有类型,做类型转换后还是null
boolean b6 = (String) null instanceof String;
// Data对象是否是String对象的实例,编译不通过,Date类和String没有继承或实现关系
// boolean b7 = new Date() instanceof new String;
}
}