由于最近开发的项目越来越大,导致项目开发的后期需要大量的时间去看懂之前自己的代码,所以统一的代码格式是很必要的
变量命名
- 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,则可以使用复数形式
- 抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类名开始,以Test结尾。
- 类型与中括号紧挨相连来定义数组。
- 枚举类名带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。
常量
-
采用字母全部大写、单词之间加下划线的方式,而局部常量采用小驼峰形式即可。
实例如下:
public class Constant { /** 局部常量采用字母全大写、单词之间加下划线的方式 */ public static final String GLOBAL_CONSTANT = "shared in global"; private static final String CLASS_CONSTANT = "shared in class"; public void f(String a) { // 局部常量使用小驼峰 final String methodContrant = "shared in method"; } /** 数组常量初始化,左括号后必须换行,且数组中的元素之间必须有一个空格 */ final static char[] digits = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z' }; }
缩进
- 由于不同编辑器对tab键解析的方式不一样,所以推荐使用4个空格,禁止使用tab键
空格
-
任何二目、三目运算符的左右两边都必须加一个空格。
-
注释的双斜杠与注释内容之间有且仅有一个空格。
-
方法参数在定义和传入时,多个参数逗号后面必须加空格。
-
没有必要增加若干个空格使变量的赋值等号与上一行对应位置的等号对齐。
-
如果大括号内为空,则简洁的写成{}即可,大括号中间无须换行和空格。
-
左右小括号与括号内部相邻字符之间不要出现空格。
-
左右大括号前需要加一个空格且不换行,左大括号后必须换行。
-
关键字if与左侧小括号之间必须有一个空格,且else语句前后必须添加一个空格。
空格与缩进实例如下:
public class SpaceCodeStyle { /** 没有必要增加若干个空格使变量的赋值等号与上一行对于位置的等号对齐 */ private static Integer one = 1; private static Long two = 2L; private static Float three = 3F; private static StringBuilder sb = new StringBuilder("code style:"); /** 缩进4个空格 (注意:本代码中任何注释在双斜线与注释内容之间有且只有一个空格) */ public static void main(String[] args) { // 继续缩进4个空格,且左右大括号前必须有空格 try { // 任何二目运算符的左右必须有一个空格 int count = 0; // 三目运算符的左右两边都必须有一个空格 boolean condition = (count == 0) ? true : false; // 关键字if与左侧小括号之间必须有一个空格 // 左括号与字母C与左括号、字母n与右括号都不需要空格 // 右括号后与左大括号前必须有一个空格且不换行,左大括号后必须换行 if (condition) { System.out.println("world"); // else的前后都必须加空格 // 右大括号前换行,右大括号后有else时用不换行 } else { System.out.println("ok"); // 在右大括号后直接结束,则必须换行 } // 如果是大括号内的内容为空,则简洁的写成{}即可,大括号中间无需换行和空格 } catch (Exception e) {} // 在每个实参逗号之后必须有一个空格 String result = getString(one, two, three, sb); System.out.println(result); } /** 方法之间,通过空行进行隔断。在方法定义中,每个形参之后必须有一个空格 */ private static String getString(Integer one, Long two, Float three StringBuilder sb) { // 任何二目运算符的左右必须有一个空格,包括赋值运算符,加号运算符 Float temp = one + two + three; sb.append(temp); return sb.toString(); } }
单目运算符:
+(正数)、-(负数)、++、–
空行
- 在方法定义之后、属性定义与方法之间、不同逻辑、不同语义、不同业务代码之间都要通空行来分隔。
换行
-
第二行相对第一行缩进4个空格,从第三行开始,不再继续缩进。
-
运算符与下文一起换行。
-
方法调用的点符号与下文一起换行。
-
方法调用中多个参数换行时,在逗号后换行。
-
在括号前不要换行。
换行实例如下:
StringBuffer sb = new StringBuffer(); // 超过120个字符的情况下,换行且方法前的点号与上一行的点号对齐 sb.append("ma").append("chu")..... .append("gao")...... .append("xiao")..... .append("yeah");
控制语句
-
在if、else、for、while、do-while等语句中必须使用大括号,即使只有一行代码也需要加上大括号。
-
在条件表达式中不允许有赋值操作,也不允许在判断表达式中出现复炸的逻辑组合。
-
多层嵌套不能超过3层。对于超过3层的if-else的逻辑判断代码,以使用卫语句、策略模式、状态模式等实现。
-
避免使用取反逻辑运算符。
逻辑判断实例如下:
// 逻辑判断中使用复制的逻辑判断,不易理解 if ((file.open(fileName, "w") != null) && (...) || !(...)) { .... } // 将复杂的逻辑运算赋值给一个易于理解的布尔变量,方便阅读 final boolean existed = (file.open(fileName, "w") != null) && (.....) || !(...); if (existed) { ..... }
卫语句如下:
public void today() { if (isBusy()) { System.out.println("change time"); return; } if (isFree()) { System.out.println("go to travel"); return; } System.out.println("stay at home to learn Easy Coding."); return; }
注释
-
类上方的注释必须使用多行注释且斜杠星号和星号斜杠之间必须换行,并注明作者和日期,日期在作者的下一行,类的说明以及解释在作者的上一行且空一行。
-
全局变量必须使用多行注释,内容为一行是使用斜杠两个星号和一个星号且两个星号和内容以及内容和一个星号之间必须有一个空格,内容为多行是使用斜杠星号和星号斜杠之间必须换行。
-
方法上必须使用多行注释且必须使用@param、@return说明参数和返回值的作用,@param解释内容之间必须有两个空格或者解释内容在@param参数的下一个且必须有使用一个空行进行分隔,所有注释注解都必须在@param的下一行且解释内容与第一个@param的解释内容成左对齐。
-
在同一段注释里要么@param解释内容之间必须有两个空格的方式,要么解释内容在@param参数的下一个且必须有使用一个空行进行分隔的方式。
-
方法内的注释必须使用双斜杠,多行的注释内容使用多个双斜杠。
-
内部类的注释与类的注释格式相同。
实例:
/** * 类的说明................. * .......与注释注解空行..... * * @ClassName: 类名 * @Author: 作者 * @Date: 日期 * 与类名空行 */ public class Main04 { /** 内容为一行是使用斜杠两个星号和一个星号且两个星号和内容以及内容和一个星号之间必须有一个空格 */ private int one = 1; /** 与上行内容空行且与方法名空行 */ private int two = 2; /** * 注释过长使用多行注释......... * ........................... */ private int three = 3; /** * 方法注释说明一.............. * .....与注释注解空行.... * * @param args 参数说明空4个空格,注释注解与参数空两个 * @return void 与上一行内容对齐 */ public static void main(String[] args) { // 方法内使用双斜杠注释 System.out.println(one); } /** * 方法注释说明二........... * ...........空行............. * * @param one * 参数说明..注释注解与参数空两个...... * ..空行.......... * * @param two * 参数说明...注释注解与参数空两个...... * * @param three * 参数说明....注释注解与参数空两个.... * * @return String * 返回值说明.....注释注解与返回值类型空两个.... */ public static String getString(int one, int two, int three) { // 方法内多行注释 // 使用多个双斜杠 System.out.println(one); } /** * 内部类注释格式说明一........... * ....不需要与类名空行............. */ private static class TestMain04Impl implements Comparator<String>, java.io.Serializable { // 内部类使用双斜杠注释说明.......... private static final long serialVersionUID = 8575799808933029326L; // 不需要空行 private static int one = 1; // 多行注释 // 使用多个双斜杠 private static int two = 2; } /** * 内部类注释格式说明二...一行说明内容........ */ private static class TestMain05Impl implements Comparator<String>, java.io.Serializable { // 内部类使用双斜杠注释说明.......... private static final long serialVersionUID = 8575799808933029326L; // 不需要空行 private static int one = 1; // 多行注释 // 使用多个双斜杠 private static int two = 2; } }
-
强制类型转换
-
左括号前必须有一个空格,右括号后必须有一个空格
实例:
public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
for循环
-
for循环中每个分号或者冒号后面必须要一个空格
实例
for (int i = 0; i < adj.length; i++) { adj[i] = new LinkedList<Edge>(); } for (Edge edge : adj[vertex1]) { ....... }