「代碼是給人看的,順便能在機器上跑。」統一的程式碼風格能:
| 元素 | 慣例 | 範例 | 反例 |
|---|---|---|---|
| Package | 全小寫、反向域名、功能模組化 | com.company.project.module | com.Company.Project, com.company.util |
| Class/Interface/Enum/Record | PascalCase (大駝峰)、名詞/形容詞 | UserService, OrderStatus, Serializable | user_service, DataHandler, Impl |
| Method/Variable/Parameter | camelCase (小駝峰)、動詞/名詞 | calculateTotal(), userName, maxRetryCount | CalculateTotal(), user_name, mrc |
| Constant (static final) | UPPER_SNAKE_CASE | MAX_CONNECTIONS, DEFAULT_TIMEOUT_MS | MaxConnections, defaultTimeout |
| Type Parameter (泛型) | 單一大寫字母 | T, E, K, V, R | Type, Element |
| Array | 類型[] 形式 | byte[] buffer; | byte buffer[]; |
// 1. 版權/授權標頭 (公司/專案統一模板)
/**
* Copyright © 2024 Company Name. All rights reserved.
*/
// 2. Package 宣告
package com.company.project.module;
// 3. Import 區塊:標準庫 → 第三方 → 本地,字母序,避免 *
import java.time.LocalDateTime;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.company.project.common.BaseEntity;
// 4. 類別/介面定義 (含 Javadoc)
/**
* 訂單領域實體,包含狀態機流轉邏輯。
* @author Developer Name
* @since 1.0.0
*/
public class Order extends BaseEntity {
// 靜態常量
// 實例欄位
// 建構子
// 公共方法
// 保護/私有方法
// 內部類/Enum/Record
}
if/else/for/while 單行也要加大括號。// 差:魔術數字、縮寫
if (status == 2) { ... }
// 好:常量、語義化
if (order.getStatus() == OrderStatus.PAID) { ... }
// 回傳 Optional 強制調用者處理缺失情況
public Optional findById(Long id) { ... }
// 參數驗證前置
public void update(@NonNull User user) {
Objects.requireNonNull(user, "User must not be null");
...
}
final、Immutable (Guava/Immutables)、ThreadLocal、ConcurrentHashMap、LongAdder。// 定義業務異常
public class InsufficientBalanceException extends BusinessException { ... }
// 拋出帶上下文
throw new InsufficientBalanceException("Account " + accountId + " balance " + balance + " < " + amount);
// 全域異常處理器統一轉碼、記錄、回應
codeStyle.xml (IntelliJ) / formatter.xml (Eclipse),啟用 Save Actions (格式化、整理 Import、加最終修飾符)。pre-commit 跑 Checkstyle/SpotBugs,commit-msg 驗證訊息格式 (Conventional Commits)。記住:規範是為了自由,而非束縛。團隊共識 > 個人偏好,持續演進 > 一勞永逸。