下面主要从四个方面讲述Java的编码规范:
一、排版
1、相互独立的程序块直接,应该加空行。
2、较长的语句(>80字符)应该换行,并适当缩进,保证可读性。长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
3、一行只声明一个变量,一条语句。
4、if、for、while、do while语句,哪怕只有一条语句,也必须使用{}。
5、类属性和类方法不要交叉放置,不同存取范围的属性或者方法也尽量不要交叉放置。
6、修饰词按照指定顺序书写:[访问权限][static][final]
7、类内部的代码布局顺序:类属性、构造方法、方法、main方法
8、分枝格式、循环格式、异常处理格式,注意{}的位置。
二、注释
1、类和接口的注释放在class或者interface关键字之前,import关键字之后,使用“/** */”注释方式。
格式举例(根据各公司具体要求有所不同)
/**
* <一句话功能简述>
* <功能详细描述>
* @author [作者](必须)
* @see [相关类/方法](可选)
* @since [产品/模块版本](必须)
* @deprecated (可选)
*/
2、类属性的注释放在属性前面
格式:
/**
* 注释内容
*/
private String userName;
3、公共(public)和保护(protected)方法注释内容:列出方法的一句话功能简述、功能详细描述、输入参数、输出参数、返回值、异常等。
格式示例(根据各公司具体要求有所不同):
/**
* <一句话功能简述>
* <功能详细描述>
* @param [参数1] [参数1说明]
* @param [参数2] [参数2说明]
* @return [返回类型说明]
* @exception/throws [异常类型][异常说明]
* @see [类、类#方法、类#成员]
* @since [起始版本]
* @deprecated
*/
注意:异常注释用@exception或@throws表示,在JavaDoc中两者等价,但推荐用@exception标注Runtime异常,用throws标注非Runtime异常。
异常的注释必须说明该异常的含义及什么条件下抛出该异常。
4、代码注释使用 // 进行,与其描述的代码相近,对代码的注释应放在其上方,并与其上面的代码用空行隔开,注释与所描述内容进行同样的缩进。
5、注释的其他规则与建议
1)修改代码时修改相应的注释,以保证注释和代码的一致性,不再有用的注释要删除。
2)注释的内容要清楚、明了,含义准确,防止注释二义性。
3)避免在注释中使用缩写,特别是不常用缩写。
4)对重写父类的方法必须进行@Override声明。
5)一些复杂的代码一定进行说明。
三、命名规则
1、类名和接口名字使用意义完整的英文描述,增强可读性。每个英文单词的首字母使用大写,其余字母使用小写。
例如:ConnectionManager、UserDAO、Customer
2、属性名使用意义完整的英文描述,第一个单词的字母使用小写,剩余单词的首字母大写、其余字母小写。属性名不能与方法名相同,集合意义的属性名使用复数形式。
例如:private String customerName; private List
3、方法名的命名规则基本与属性名相同,不过方法名一般以动词开头。
例如:private void initFrame(){}
4、常量名使用全大写的英文描述,英文单词之间用下划线隔开,并使用final或者static final修饰。
例如:public final int MAX_VALUE = 1000;
四、性能和可靠性
1、使用System.arrayCopy方法进行数组拷贝,提高性能。
int[] a = {3,5,6,12,45};
int[] b = {23,12,4,53,2};
System.arraycopy(a, 1, b, 2, 2);
for(int i=0; i < b.length; i++){
System.out.print(b[i]+" "); //23 12 5 6 2
}
2、把集合转换成数组时,使用Collection中的toArray方法,不要使用循环。
List
String[] strArr = new String[strList.size()];
String[] strs = strList.toArray(strArr);
3、大量字符串的相加等于处理应该使用StringBuffer。“大量”一般指5次“+=”以上或者在循环中进行字符串“+=”操作。
例如:
String[] strs = {"aa","bb","cc","dd","ee","ff","gg"};
String str = "";
for(int i = 0; i < strs.length; i++){
str += strs[i];
}
应改为
String[] strs = {"aa","bb","cc","dd","ee","ff","gg"};
StringBuffer sbf = new StringBuffer();
for(String str : strs){
sbf.append(str);
}
4、尽量使用JDK自带的API类库中的类和方法,不要自己写类似功能的类。
API在可靠性、性能方面一般有更好的表现,必须熟练掌握,特别是算法方面的。
5、IO操作流使用有Buffer功能的类,如BufferedReader以及BufferedWriter,拥有更好的性能,没有Buffer的IO流频繁IO操作,效率相对低。
FileReader fr = new FileReader("D://test.txt");
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();
while(line != null){
System.out.println(line);
line = br.readLine();
}
6、不要在循环内执行不必要的重复操作,可在循环外调用一次的,就避免在循环内进行不必要的反复调用。
例如:
for(int i = 0; i < result.size(); i++){
//...
}
应写成:
int size= result.size();
for(int i = 0; i < size; i++){
//...
}
7、除非必要,否则不要频繁在循环内创建对象,以免影响效率。
8、除非必要,否则尽量把循环次数多的循环放在内层,减少跨切循环的次数。循环次数不要超过三层。