Java 编码规范与最佳实践
良好的编码规范是保证代码质量的基础。理解 Java 编码规范和最佳实践是进行专业开发的关键。本章将介绍 Java 编码 规范与最佳实践。
命名规范
类名
类名使用大驼峰命名(PascalCase):
// ✅ 正确
public class UserService {
}
public class OrderController {
}
// ❌ 错误
public class userService { // 首字母小写
}
public class order_controller { // 使用下划线
}
方法名和变量名
方法名和变量名使用小驼峰命名(camelCase):
// ✅ 正确
public void getUserName() {
String userName = "张三";
int userAge = 25;
}
// ❌ 错误
public void get_user_name() { // 使用下划线
String user_name = "张三";
}
常量名
常量名使用全大写下划线分隔(UPPER_SNAKE_CASE):
// ✅ 正确
public static final int MAX_SIZE = 100;
public static final String DEFAULT_NAME = "未知";
// ❌ 错误
public static final int maxSize = 100; // 不是常量命名
包名
包名使用小写字母,点分隔:
// ✅ 正确
package com.example.myapp.service;
// ❌ 错误
package com.example.MyApp.service; // 包含大写
注释规范
类注释
/**
* 用户服务类
* 提供用户相关的业务逻辑处理
*
* @author 张三
* @version 1.0
* @since 2024-01-01
*/
public class UserService {
}
方法注释
/**
* 根据用户ID获取用户信息
*
* @param userId 用户ID,不能为null
* @return 用户对象,如果不存在返回null
* @throws IllegalArgumentException 如果userId为null
*/
public User getUserById(Long userId) {
if (userId == null) {
throw new IllegalArgumentException("用户ID不能为null");
}
// 实现
return null;
}
行内注释
public void processData() {
// 验证数据
if (data == null) {
return;
}
// 处理数据
process(data);
}
异常处理与性能优化
异常处理
// ✅ 推荐:捕获具体异常
try {
processFile(filename);
} catch (FileNotFoundException e) {
logger.error("文件不存在:" + filename, e);
} catch (IOException e) {
logger.error("IO错误", e);
}
// ❌ 不推荐:捕获所有异常
try {
processFile(filename);
} catch (Exception e) { // 太宽泛
e.printStackTrace();
}
// ✅ 推荐:使用 try-with-resources
try (FileInputStream fis = new FileInputStream(file)) {
// 使用资源
} catch (IOException e) {
logger.error("错误", e);
}
性能优化
// ✅ 推荐:使用 StringBuilder 拼接字符串
StringBuilder sb = new StringBuilder();
for (String str : strings) {
sb.append(str);
}
String result = sb.toString();
// ❌ 不推荐:使用 + 拼接
String result = "";
for (String str : strings) {
result += str; // 性能差
}
// ✅ 推荐:使用增强 for 循环
for (String item : list) {
process(item);
}
// ⚠️ 可以:需要索引时使用传统 for
for (int i = 0; i < list.size(); i++) {
process(list.get(i), i);
}
代码重构建议
提取方法
// ❌ 不推荐:方法过长
public void processOrder(Order order) {
// 验证订单
if (order == null) {
throw new IllegalArgumentException("订单不能为null");
}
if (order.getItems().isEmpty()) {
throw new IllegalArgumentException("订单不能为空");
}
// 计算总价
double total = 0;
for (OrderItem item : order.getItems()) {
total += item.getPrice() * item.getQuantity();
}
// 应用折扣
if (order.getDiscount() > 0) {
total = total * (1 - order.getDiscount());
}
// 保存订单
order.setTotal(total);
orderDao.save(order);
}
// ✅ 推荐:提取方法
public void processOrder(Order order) {
validateOrder(order);
double total = calculateTotal(order);
applyDiscount(order, total);
saveOrder(order);
}
private void validateOrder(Order order) {
if (order == null) {
throw new IllegalArgumentException("订单不能为null");
}
if (order.getItems().isEmpty()) {
throw new IllegalArgumentException("订单不能为空");
}
}
private double calculateTotal(Order order) {
double total = 0;
for (OrderItem item : order.getItems()) {
total += item.getPrice() * item.getQuantity();
}
return total;
}