1. 引言
在编程中,风格不是关于时尚,而是关于生存。Java 是一门常被大型团队使用的语言,如果每个人都按“各写各的”的习惯来写,项目很快就会变成一堆彼此割裂的碎片,最终可能只有作者本人能看懂(而且也不一定)。
代码风格是一组让所有人都能同样读懂代码的规则。这就像交通标志:如果视而不见,交通很快就会变成一团乱麻。
为什么这很重要?
- 可读性:代码被阅读的频率远高于被编写。糟糕的风格就像医生潦草的字迹:谁都看不明白写了什么。
- 可维护性:遵循规则的代码更容易修改,意外破坏的概率更低。
- 协作:团队中每个人都应无需额外解释就能互相理解。
- 工具:当风格统一时,自动格式化器和静态分析器的效果更好。
2. 代码风格中的主要错误(以及如何避免)
忽视缩进和花括号
错误:
没有缩进、花括号杂乱的代码让眼睛和大脑都受折磨。
if(x>0){
System.out.println("x 是正数");
}else{
System.out.println("x 不是正数");
}
正确示例:
if (x > 0) {
System.out.println("x 是正数");
} else {
System.out.println("x 不是正数");
}
说明:
建议每一层缩进使用四个空格(这是 Java 的标准)。除非全队另有一致约定,否则不要使用制表符(Tab)。
不合适的变量、方法和类名
错误:
int a = 5;
String s = "John";
void f() { /* ... */ }
正确示例:
int age = 5;
String userName = "John";
void printReport() { /* ... */ }
说明:
命名应当有意义并能反映变量或方法的意图。
- 类名:首字母大写,CamelCase,例如:UserAccount。
- 方法与变量名:首字母小写,camelCase,例如:calculateSalary、userList。
过长的方法与类
错误:
100 行的方法、1000 行的类——对维护来说简直是 nightmare mode。
正确示例:
每个方法只做一件事且尽量短(最好一屏能看完)。类也不要膨胀到《战争与和平》的体量。
示例:
不好:
public void processOrder() {
// 200 行代码
}
好:
public void processOrder() {
validateOrder();
calculateTotal();
saveToDatabase();
sendEmailConfirmation();
}
使用“魔法数字”和字符串
错误:
if (status == 42) {
// ...
}
正确示例:
public static final int STATUS_APPROVED = 42;
if (status == STATUS_APPROVED) {
// ...
}
说明:
不要使用“魔法”的数字与字符串,改用常量(static final)。在较新的 Java 版本中还有 enum —— 对于受限取值集合请使用它们。
注释:缺失或过度
错误 1:
完全没有注释——复杂代码让人摸不着头脑。
错误 2:
对每一个动作都写注释,哪怕是显而易见的。
// 将 x 增加 1
x = x + 1;
// 检查 x 是否等于 10
if (x == 10) {
// ...
}
这类注释只会添乱!只对复杂或不明显的地方进行注释。理想情况下,好的代码无需注释也能读懂——注释应解释“为什么”,而不是“做了什么”。
// 考虑 VIP 客户的折扣
double total = calculateTotalWithDiscount();
3. Java 的约定:专业人士如何书写
Java 中有官方与事实上的代码格式标准。Oracle Java Code Conventions 和 Google Java Style Guide 是最流行的两套。
缩进与花括号
开括号与声明在同一行:
public void print() {
// ...
}
嵌套层级使用四个空格。
命名
- 类与接口: 首字母大写的 CamelCase(Person、UserAccount)。
- 方法与变量: 首字母小写的 camelCase(calculateSalary、userList)。
- 常量: 全部大写并以下划线分隔(MAX_SIZE、DEFAULT_TIMEOUT)。
- 包名: 仅小写,可用点分隔(com.example.project)。
空格
在运算符两侧以及逗号之后添加空格:
int sum = a + b;
System.out.println(name, age);
不要在开括号后与闭括号前添加空格:
if (x > 0) { ... }
行长度
建议每行不超过 100–120 个字符。(是的,你的显示器很大,但代码在不横向滚动时更易读。)
类成员声明顺序
推荐顺序(来自 Oracle):
- 字段(先静态的,再普通的)
- 构造函数
- 方法
示例:
public class User {
private static int userCount;
private String name;
public User(String name) {
this.name = name;
userCount++;
}
public String getName() {
return name;
}
}
4. 示例:重构糟糕风格的代码
下面是一个你可能在“野外”遇到的类:
class Person{String n;int a;void p(){System.out.println(n+" "+a);}}
某个办公室里,已经有一位 Java 开发者为这段代码流下了眼泪。
让我们把它优化一下:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void print() {
System.out.println(name + " " + age);
}
}
发生了什么变化:
- 类与成员使用了正确的访问修饰符。
- 命名有意义、易读。
- 每个类成员单独起一行。
- 使用构造函数进行初始化。
- 字段设为 private,以遵循封装。
5. 实用细节
自动格式化器
现代 IDE(IntelliJ IDEA、Eclipse、VS Code)可以按标准自动格式化代码。
快捷键:
- IntelliJ IDEA: Ctrl + Alt + L
- Eclipse: Ctrl + Shift + F
静态分析
Checkstyle、SonarLint、PMD 等工具能够在程序运行之前就发现风格违规和潜在错误。
实际表现:
- 如果你把变量命名为 x 而不是 userAge,Checkstyle 会提出警告。
- 如果方法过长或者类违背了 SOLID 原则,SonarLint 会给出提示。
职责分离与“整洁”代码
- 每个类应只负责一个职责(Single Responsibility Principle)。
- 不要害怕创建额外的类和方法——这不是“臃肿”,而是对未来读者的照顾。
- 尽量避免重复代码:如果看到两个类似的片段——把它们抽取到单独的方法中。
常量与“魔法数字”:正确做法
不要这样:
double price = 100 * 0.18;
更好:
public static final double VAT_RATE = 0.18;
double price = 100 * VAT_RATE;
如果经常出现固定的取值集合——请使用 enum:
public enum Status {
NEW, IN_PROGRESS, DONE
}
6. 代码风格与可读性的常见错误
错误 1:忽视代码规范。
如果团队没有统一的风格,代码很快会变得难以阅读并且难以维护。即使你独自编写,一年后你也会感谢现在的自己。
错误 2:名字过短/过长。
变量 a 或 temp —— 不好。变量 theCurrentUserNameThatIsUsedForAuthorizationInTheSystem —— 也不建议。找到平衡:userName、age、bookList。
错误 3:“魔法数字”。
把数字和字符串直接写进代码会妨碍维护并增加出错概率。
错误 4:巨型方法与类。
方法越大越难测试与理解。请拆分为逻辑更清晰的部分。
错误 5:糟糕的类结构。
字段随处散落、方法顺序杂乱——都让人很难快速定位需要的地方。
错误 6:过度或缺失的注释。
在 int x = 0; 旁边写“初始化变量”的注释没有必要。解释复杂业务逻辑的注释则非常必要。
错误 7:不一致的格式化。
项目一处用四个空格、另一处用制表符,这里花括号另起一行,那里却不换行。这看起来邋遢,也会惹恼同事。
GO TO FULL VERSION