最近审查一个小项目代码,项目组的成员既有老员工,也有许多新来的本科生。抽一点时间加代码中出现的一些问题总结一下,记录如此,希望给刚入行的新人一点点参考。
一、书写规范
sun官方有自己推荐的规范:http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html
不习惯看英文的可以到网上搜搜中文翻译,新手应该看看,虽然很多不好的习惯无伤大雅。但是有经验的人会用“约定成俗”标准来“看待”我们,再者遵循这些标准,百益而无一害,将来维护的不一定是你,否则将来可能天天有人背后骂你。即使如此,我们还是容易我行我素,常见陋习如下:
1 、【类有名称,无意义】例:Pkt.java
2 、【方法名称首字母不小写】
3 、【类名方法名多个单词连载一起不用驼峰表示】例:systemwarning();推荐:systemWarning();
4 、【多余变量】一些变量定义了,从未使用,代码提交时候却不清理掉。
二、含糊的用法
虽然Java语言,没有非常严格的语法规范,或许正是这一点我们更容易忽略许多细节。
1、public、private、protected修饰符和访问权限
priavte 本类可见
public 所有类可见
protected 本包和所有子类都可见
friendly 本包可见(即默认的形式)
其实在实际应用中,public和private是比较熟悉和好记忆的,主要记住区别protected和friendly两种访问控制修饰符。
那么在实际应用中,private的类型是在封装的概念上体现较为明显的。private类型的变量都需要通过调用对象的getter和setter方法来访问。为了安全起见,public多适用于构造方法(单对象类除外)、类静态常量等一些形式。
访问权限修饰符权限从高到低排列是public 、protected 、friendly、 private,有人会所有都有public修饰,以为这样就不会有问题,存在安全隐患。
2、关键字final、static
关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
final修饰的类不能被继承,没有子类,final类中的方法默认是final的。
final修饰方法不能被子类的方法覆盖,但可以被继承。
final修饰成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
关键字static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。
static修饰的成员变量和成员方法独立于该类的任何对象。(它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。)
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大,呵呵)。
以上2点摘自其他网友文章,这里只是整理一下。
常见陋习:
1、
private final int STORE_FLAG=1;===》private static int STORE_FLAG=1;
2、浪费内存的构造
String queryString = new String("from Log u where 1 = 1");===》StringqueryString = "from Log u where 1 = 1"
3、不好的字符串拼接
// This is bad
String s = "";
for (int i = 0; i < field.length; ++i) {
s = s + field[i];
}
// This is better
StringBuffer buf = new StringBuffer();
for (int i = 0; i < field.length; ++i) {
buf.append(field[i]);
}
String s = buf.toString();
4、无效的trim()
String ss = xmlcontent;
ss.trim();===>ss = ss.trim();
Object[] obj=new Object[]{ss};
5、变量定义到for循环外部