建议1:不要在常量和变量中出现易混淆的字母
包(package)名全部小写,类(class)名首字母全大写,常量全部大写,并用下划线分隔,变量采用驼峰(camel case)命名法则(第一个单词以小写字母开始,第二个单词的首字母大写或者每一个单词的首字母都采用大写字母);
在变量的声明中不要引入容易混淆的字母。例如:long i=1l(字母l和大写字母O尽量不要和数字混用,如果必须混合使用,字母l必须大写,字母O添加注释)。
建议2:莫让常量蜕变成变量
不要用随机数生成的方式定义变量。例如:public static final int RAND_CONST=new Random().nextInt();
常量就是常量,在编译器就必须确定其值,不应该在运行期间发生更改。
建议3:三元操作符的类型务必一致
三元操作符是if-else的简化写法。
public class Clint{
public static void main(String[] args){
int i=70;
Sting s=String.valueOf(i<100?80:100);
Stirng s1=String.valueOf(i<100?80:100.0);
System.out.println(s.equals(s1));
}
}
结果输出为false.原因是在计算s1时,对返回值进行了类型转换,返回float类型的。
建议4:避免带有变长参数的方法重载
变长参数是变量个数不定,例如:int... count
建议5:别让null值和空值威胁到变长方法
建议6:覆写变长方法也循规蹈矩
在JAVA中,子类覆写父类中的方法很常见,这样做既可以修正bug,也可以提供扩展的业务功能支持。
遵循开闭原则设计出的模块具有两个主要特征:[1]
(1)对于扩展是开放的(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。
(2)对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。
覆写方法需要满足的条件:
1) 重写方法不能缩小访问权限
2) 参数列表必须与被重写方法相同。
3) 返回类型必须与被重写方法的相同或是其子类
4) 重写方法不能抛出新的异常,或者超出父类范围的异常,但是可以抛出更少、更有限的异常或者不抛出异常。
[重载方法]方法名相同,参数类型,参数个数至少有一个不相同
[重写方法]重写父类的方法,方法名字相同,参数类表相同,方法体不同
建议7:警惕自增的陷阱
建议8:不要让旧语法困扰你
建议9:少用静态导入
例如:import static org.junit.Assert
对于静态导入,一定要遵循两个规则:
1) 不适用*通配符,除非是导入静态常量类(只包含常量的类和接口)
2) 方法名是具有明确、清晰表象意义的工具类。
建议10:不要在本类中覆盖静态导入的变量和方法
建议11:养成良好习惯,显式声明UID
我们编写一个实现了serializable接口的类,Eclipse马上就会给一个黄色警告:需要增加一个Serial Version ID。
类实现serializable接口的目的是为了可持久化,比如网络传输或本地存储,为系统的分布和异构部署提供先决支持条件。
建议12:避免用序列化类在构造函数中为不变量赋值
反序列化时,构造函数不会执行。
在序列化类中,不使用构造函数为final变量赋值。
建议13:避免为final变量复杂赋值
建议14:使用序列化类的私有方法巧妙解决部分属性持久化问题
(该建议没怎么看懂,最好看原来的工资例子)
建议15:break不可少
在swithch语句中,每个case语句后一定要跟上break,养成良好的习惯。
避免出错方法:修改IDE的警告级别,例如在Eclipse中,
可以依次点击
Preferences—java—Compiler—Errors/Warnings—Potential Programming problems,然后点击修改 switch case fall-through 为Errors级别,以后如果在case语句中不加break,就会报错。
建议16:易变业务使用脚本语言编写
(该建议不太懂,对于脚本语言不太明白)
建议17:慎用动态编译
建议18:避免instanceof非预期结果
Instanceof是一个简单的二元操作符,它是用来判断一个对象是否是一个类实例的。
Instanceof只能用于对象的判断,不能用于基本类型的判断。
Instanceof操作符的左右操作数必须有继承或者实现关系,否则编译会失败。
建议19:断言绝不是鸡肋
在java中的断言使用的是assert关键字,基本用法如下:
Assert<布尔表达式>
(该建议没用过,不太懂)
建议20:不要只替换一个类.
…
建议29:优先选择基本类型
包装类型自动装箱有一个重要的原则:基本类型可以先加宽,再转变成宽类型的包装类型,但不能直接转变成宽类型的包装类型。举例说:int可以加宽转变成long,然后再转变成Long对象,但不能直接转变成包装类型。int可以自动转化成Integer,long类型自动转化成Long。
建议30:不要随便设置随机种子
随机数和种子之间的关系:
种子不同,产生的随机数不同
种子相同,即使实例不同,也产生相同的随机数
若非必要,不要设置随机数种子
建议31:在接口中不要存在实现代码
接口中可以声明常量,声明抽象方法,也可以继承父接口,但就是不能有具体实现。
建议32:静态变量一定要先声明后赋值
静态变量是类加载时被分配到数据区的,在内存中,只有一个拷贝,不会被分配多次,其后的所有赋值操作都是值改变,地址则保持不变。