写在最前
笔者实习过程中,代码规范问题是最常见的,codeReview时频频被点名。
现在就盘点一些常见的问题,能力有限,欢迎补充!!!
0.变量和方法名应该具有描述性,使用驼峰命名法
问题:使用具有描述性的变量和方法名可以使代码更易于阅读和理解,而使用含糊或不清晰的命名可能会引起歧义或让代码难以维护。
// 优秀示例
int studentAge;
void calculateAverageGrade();
// 错误示例
int x;
void abc();
1. 对于常量,使用大写字母和下划线进行命名
问题:使用大写字母和下划线命名常量可以使其更易于识别和区分于其他变量。
// 优秀示例
final int MAX_NUM = 100;
final String DEFAULT_NAME = "John Doe";
// 错误示例
final int maxNum = 100;
final String defaultName = "John Doe";
3.在循环时使用 ++i 或 --i 代替 i++ 或 i--。
问题:使用 ++i 或 --i 代替 i++ 或 i-- 可以提高循环效率,避免创建新的临时变量。
// 优秀示例
for (int i = 0; i < 10; ++i) {
System.out.println(i);
}
// 错误示例
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
4.避免在循环中使用过多的方法调用或变量声明。
问题:在循环中过多的方法调用或变量声明可能会降低性能并导致代码难以维护
// 优秀示例
int sum = 0;
for (int i = 0; i < array.length; ++i) {
sum += array[i];
}
// 错误示例
for (int i = 0; i < array.length; ++i) {
doSomething(i);
int x = calculateValue(i);
// ...
}
5.在方法签名中,使用具有描述性的参数名和注释
问题:具有描述性的参数名和注释可以让其他开发者更容易地理解方法的作用。
// 优秀示例
public void calculateAverageGrade(int[] grades) {
// 计算平均成绩
// ...
}
// 错误示例
public void calculateAverageGrade(int[] arr) {
// ...
}
6.使用 final 修饰不可变的引用类型变量
问题:使用 final 修饰不可变的引用类型变量可以防止在不应该修改变量时进行修改。
// 优秀示例
final List<String> names = new ArrayList<>();
// 错误示例
List<String> names = new ArrayList<>();
7.避免在循环中使用 try-catch 块,因为这会降低性能。应该在循环之外处理异常
使用
try-catch块来捕获异常是很常见的。但是,如果在循环中使用try-catch块来捕获异常,那么每次循环都会进行异常处理,这样会导致性能下降。应该将try-catch块放在循环外部,只处理循环体外的异常
List<String> list = new ArrayList<>();
// 正确示例:将 try-catch 块放在循环外部
try {
for (String s : list) {
// do something
}
} catch (Exception e) {
// handle exception
}
// 错误示例:在循环中使用 try-catch
for (String s : list) {
try {
// do something
} catch (Exception e) {
// handle exception
}
}
8.避免在循环中使用字符串拼接
在循环中使用字符串拼接会产生大量的临时字符串对象,这样会导致性能下降。应该使用
StringBuilder类来进行字符串拼接
List<String> list = new ArrayList<>();
// 正确示例:使用 StringBuilder 进行字符串拼接
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s);
}
String result = sb.toString();
// 错误示例:在循环中使用字符串拼接
String result = "";
for (String s : list) {
result += s;
}
9.避免使用"=="比较字符串
在Java中,使用
==比较字符串会比较它们的引用而不是内容,这样会导致比较结果不正确。应该使用equals()方法来比较字符串
String s1 = "hello";
String s2 = "world";
// 正确示例:使用 equals 方法比较字符串
if (s1.equals(s2)) {
// do something
}
// 错误示例:使用 == 比较字符串
if (s1 == s2) {
// do something
}
10.避免使用魔法数值和硬编码字符串
不要在代码中直接使用数值和字符串,而应该将它们定义为常量或者枚举类型,这样会使代码更易于维护和修改。
// 不好的做法
if (status == 1) {
// do something
}
// 好的做法
private static final int STATUS_OK = 1;
if (status == STATUS_OK) {
// do something
}
11.避免使用长的代码行
不要在一行代码中写入过多的内容,这会降低代码的可读性和可维护性。应该将代码分成多行,使用合适的缩进,以便更好地组织代码结构。
// 不好的做法
StringBuilder sb = new StringBuilder("Hello World!").append("This is a long string.");
// 好的做法
StringBuilder sb = new StringBuilder("Hello World!")
.append("This is a long string.");
12.避免使用全局变量
全局变量会影响代码的可读性和可维护性,并且可能导致意外的副作用。应该尽可能地避免使用全局变量,而是使用局部变量或者成员变量
// 不好的做法
public class Example {
public static int count = 0;
// other code
}
// 好的做法
public class Example {
private int count = 0;
// other code
}
13.使用面向接口编程
在Java或Kotlin中,应该使用面向接口编程,而不是面向实现编程。这样可以提高代码的灵活性和可扩展性。
// 不好的做法
ArrayList<String> list = new ArrayList<>();
// 好的做法
List<String> list = new ArrayList<>();
14.避免使用大量的嵌套代码块
避免使用大量的嵌套代码块,尽量保持代码层次结构清晰,易于阅读
// 不好的写法
if (condition1) {
if (condition2) {
if (condition3) {
// do something
}
}
}
// 好的写法
if (condition1 && condition2 && condition3) {
// do something
}
15.合理使用异常
不要使用异常来代替普通的程序逻辑,只在必要时才使用异常
// 不好的写法
try {
// do something
} catch (Exception e) {
// handle exception
}
// 好的写法
if (condition) {
// do something
} else {
// handle error
}
16.关于枚举
不要滥用枚举类型,只在需要有限个数的常量时使用。
// 不好的写法
enum Fruit {
APPLE,
BANANA,
ORANGE,
WATERMELON,
PEAR,
...
}
// 好的写法
private static final String APPLE = "apple";
private static final String BANANA = "banana";
private static final String ORANGE = "orange";
...