一、Java开发中通用的方法和准则
1:不要在常量和变量中出现易混淆的字母。
注意:包名全小写,类名首字母全大写,常量全部大写并用下划线分隔,变量采用驼峰命名法等。
2:莫让常量蜕变成变量。
例:public static final int RAND_CONST = new Random().nextInt();
注意:务必让常量的值在运行期保持不变。
3:三元操作符的类型务必一致。
若两个操作数不可转换,则不转换,返回值为Object类型。
若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。
若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,刚转换为T类型;若S超出了T类型的范围,则T转换为S类型。
若两个操作数都是直接量数字,则返回值类型为范围较大者。
4:避免带有变长参数的方法重载。
5:别让null值和空值威胁到变长方法。
6:覆写变长方法也循规蹈矩。
注意:覆写的方法参数与父类相同,不仅仅是类型、数量,还包括显示形式。
7:警惕自增的陷阱。
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
}
8:不要放旧语法困扰你。
9:少用静态导入。
对于静态导入,一定要遵循两个规则:
不使用*通配符,除非是导入静态常量类。
方法名是具有明确、清晰表象意义的工具类。
10:不要在本类中覆盖静态导入的变量和方法。
11:养成良好的习惯,显示声明UID。
注意:显式声明serialVersionUID可以避免对象不一致,但尽量不要以这种方法向JVM”撒谎“。
12:避免用序列化类在构造函数中为不变量赋值。
注意:在序列化类中,不使用构造函数为final变量赋值。
13:避免为final变量复杂赋值。
14:使用序列化类的私有方法巧妙解决部分改改持久化问题。
15:break万万不可忘。
16:易变业务使用脚本语言编写。
17:慎用动态编译。
18:避免instanceof非预期结果。
19:断言绝对不是鸡肋。
20:不要只替换一个类。
注意:发布应用系统时禁使用类文件替换方法,整体WAR包发布才是万全之策。
二、基本类型
21:用偶判断,不用奇判断。
注意:对于基础知识,我们应该"知其然,并知其所以然"。
22:用整数类型处理货币。
23:不要让类型默默转换。
注意:基本类型转换时,使用主动声明方式减少不必要的Bug。
24:边界,边界,还是边界。
25:不要让四舍五入亏了一方。
注意:根据不同的场景,慎重选择不同的舍入模式,以提高项目的精准度,减少算法损失。
26:提防包装类型的null值 。
27:谨慎包装类型的大小比较。
28:优先使用整型池。
注意:通过包装类的valueOf生成包装实例可以显著提高空间和时间性能。
29:优先选择基本类型。
注意:重申,基本类型优先考虑。
30:不要随便设置随机种子。
注意:若非必要,不要设置随机数种子。
三:类、对象及方法
31:在接口中不要存在实现代码。
注意:接口中不能存在实现代码。
32:静态变量一定要先声明后赋值。
注意:两次重申变量要先声明后使用,这不是一句废话。
33:不要覆写静态方法。
34:构造函数尽量简化。
注意:构造函数简化,再简化,应该达到”一眼洞穿“的境界。
35:避免在构造函数中初始化其他类。
36:使用构造代码块精炼程序。
37:构造代码块会想你所想。
注意:放心地使用构造代码块吧,Java已经想你所想了。
38:使用静态内部类提高封装性。
39:使用匿名类的构造函数。
40:匿名类的构造函数很特殊。
41:让多重继承成为现实。
42:让工具类不可实例化。
注意:如果一个类不允许实例代,就要保证”平常“渠道都不能实例化它。
43:避免对象的浅拷贝。
注意:浅拷贝只是Java提供的一种简单拷贝机制,不便于直接使用。
44:推荐使用序列化实现对象的拷贝。
45:覆写equals方法时不要识别不出自己。
46:equals应该考虑null值情景。
47:在equals中使用getClass进行类型判断。
48:覆写equals方法必须覆写hashCode方法。
49:推荐覆写toString方法。
50:使用package-info类为包服务。
51:不要主动进行垃圾回收。
四:字符串
五:数组和集合
六:枚举和注解
七:泛型和反射
八:异常
九 :多线程和并发
十:性能和效率
十一:开源世界
十二:思想为源