改善Java程序的151个建议(1-4)
1.不要在常量和变量中出现易混淆的数字
个人感觉这条在于编程命名的规范性。代码除了给机器看,也要给人看。要写能够结构清晰,命名规范,让人看懂的代码。
字母l作为长整型标志时务必大写 l
2.莫让常量蜕变成变量
java的常量有编译期常量和运行期常量。他们都被static final修饰。引用被static final 修饰的java八种基本类型(int,long,byte,short,float,double,char,boolean)和直接赋值的string类型的地方会被替换成实际值,例如 public static final int a = 1; 引用a的地方会被直接替换成1.基本类型的包装类型不可以。以上几种是编译期常量。
运行期常量是到运行时才能确定值。例如public static final int a = math.getexponent(32); a的值需要经过计算才能完成。当然也不是所有经过计算才能得到值的都是运行时常量。
如:public static final a = 1+1; 仍然属于编译期常量。
oracle官方文档第15章28节对编译期常量作了解释。
书中的例子:public static final int rand_const = new random().nextint(); 导致rand_const的值是不可预期的。
3.三元操作符的类型务必一致
1 public static void main(string[] args) { 2 int i = 80; 3 string s = string.valueof(i < 100 ? 90 : 100); 4 string s1 = string.valueof(i < 100 ? 90 : 100.0); 5 system.out.println(s); 6 system.out.println(s1); 7 system.out.println(s.equals(s1)); 8 }
输出的结果为90,90.0,false
造成这种结果的原因是三元操作符是要返回一个类型的结果的,编译器并不允许 条件为真时返回int 为假时返回float,所以三元操作符进行了类型转换。
三元操作符类型转换原则如下
1.若两个操作数不可转换,则不做转换,返回值为object类型。
2.若两个操作数时明确类型的表达式,则按照正常的二进制数字来转换。int转换为long,long转换为float等。
3.若两个操作数有一个是数字s,另外一个是表达式,且其类型标识为t,那么若数字s在t的范围内,则转换为t的类型,若s超出了t类型的范围,则t转换为s类型
4.若两个数都是字面值(literal)则返回值类型为范围较大者。
4.避免带有变长参数的方法重载
变长参数的方法重载不推荐使用主要是会对人产生误导。
1 public static void sysout(string test) { 2 system.out.println("1.hello " + test); 3 } 4 5 public static void sysout(string... test) { 6 for (string string : test) { 7 system.out.println("2.hi " + string); 8 } 9 } 10 11 public static void main(string[] args) { 12 sysout("xu5hy"); 13 }
输出 1.hello xu5hy
推荐阅读
-
给大家一些改善 Python 程序的 91 个建议
-
给大家一些改善 Python 程序的 91 个建议
-
改善Java程序的151个建议(1-4)
-
改善Python程序的建议总结
-
一位10年开发资深程序员大牛给予Java初学者的学习路线建议
-
少走弯路,给Java程序员的建议
-
C#程序编写高质量代码改善的157个建议【10-12】[创建对象时需要考虑是否实现比较器、区别对待==和Equals]
-
C#程序编写高质量代码改善的157个建议【4-9】[TryParse比Parse、使用int?来确保值类型也可以为null、readonly和const、0值设为枚举的默认值、避免给枚举类型的元素提供显式的值、习惯重载运算符]
-
C#程序编写高质量代码改善的157个建议【13-15】[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
-
C#程序编写高质量代码改善的157个建议【20-22】[泛型集合、选择集合、集合的安全]