--- description: 该规则解释了 Java 的约定和最佳实践。 globs: **/*.java alwaysApply: false --- # Java 语言规范 ## Java 21 特性使用 - **Record类**:用于不可变数据传输对象 ```java public record UserInfo(String name, String email, LocalDateTime createdAt) {} ``` - **Pattern Matching**:在switch表达式中使用模式匹配 ```java public String formatValue(Object value) { return switch (value) { case String s -> "String: " + s; case Integer i -> "Number: " + i; case null -> "null value"; default -> "Unknown: " + value.toString(); }; } ``` - **Text Blocks**:用于多行字符串,特别是SQL和JSON ```java String sql = """ SELECT u.name, u.email FROM users u WHERE u.status = 'ACTIVE' ORDER BY u.created_at DESC """; ``` - **Sealed Classes**:用于受限的类层次结构 ```java public sealed class Result permits Success, Error { // 基类定义 } public final class Success extends Result { private final T data; // 实现 } ``` - **Virtual Threads**:用于高并发场景 ```java try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { executor.submit(() -> { // 高并发任务 }); } ``` ## 命名约定 - **类名**:使用帕斯卡命名法(如 `UserController`、`OrderService`) - **方法和变量名**:使用驼峰命名法(如 `findUserById`、`isOrderValid`) - **常量**:使用全大写下划线分隔(如 `MAX_RETRY_ATTEMPTS`、`DEFAULT_PAGE_SIZE`) - **包名**:使用小写,按功能模块划分(如 `com.example.user.domain`) ## 代码风格 - **缩进**:使用4个空格,不使用Tab - **行长度**:每行不超过120个字符 - **大括号**:使用Egyptian风格(开括号不换行) - **空行**:方法间使用一个空行分隔,逻辑块间使用空行分隔 ## 异常处理 - **检查异常**:谨慎使用检查异常,优先使用运行时异常 - **异常链**:保持异常链,不丢失原始异常信息 ```java try { // 可能抛出异常的代码 } catch (SpecificException e) { throw new BusinessException("业务处理失败", e); } ``` - **资源管理**:使用try-with-resources自动管理资源 ```java try (var reader = Files.newBufferedReader(path)) { // 使用reader } ``` ## 集合和流处理 - **集合选择**:根据使用场景选择合适的集合类型 - `ArrayList`:随机访问频繁 - `LinkedList`:插入删除频繁 - `HashMap`:键值对存储 - `TreeMap`:需要排序的键值对 - **Stream API**:充分利用Stream API进行函数式编程 ```java List activeUserNames = users.stream() .filter(user -> user.isActive()) .map(User::getName) .sorted() .toList(); ``` ## 并发编程 - **线程安全**:优先使用不可变对象和线程安全的集合 - **锁机制**:合理使用synchronized、ReentrantLock等锁机制 - **并发集合**:使用ConcurrentHashMap、CopyOnWriteArrayList等并发集合 - **CompletableFuture**:使用CompletableFuture处理异步操作 ```java CompletableFuture future = CompletableFuture .supplyAsync(() -> fetchData()) .thenApply(data -> processData(data)) .exceptionally(throwable -> "默认值"); ``` ## 内存管理 - **对象创建**:避免在循环中创建不必要的对象 - **字符串处理**:大量字符串操作使用StringBuilder - **集合大小**:预估集合大小,避免频繁扩容 - **弱引用**:适当使用WeakReference避免内存泄漏 ## 泛型使用 - **类型安全**:充分利用泛型提供类型安全 - **通配符**:正确使用上界通配符(? extends)和下界通配符(? super) - **类型擦除**:理解泛型类型擦除的限制 ```java public > T findMax(List list) { return list.stream().max(Comparable::compareTo).orElse(null); } ``` ## 注解使用 - **标准注解**:正确使用@Override、@Deprecated、@SuppressWarnings等 - **自定义注解**:合理创建自定义注解简化代码 - **注解处理**:了解编译时和运行时注解处理 ## 测试规范 - **单元测试**:使用JUnit 5编写单元测试 - **测试命名**:测试方法使用描述性命名(如 `shouldReturnUserWhenValidIdProvided`) - **断言**:使用AssertJ提供更好的断言体验 ```java @Test void shouldCalculateCorrectTotal() { // Given List items = List.of( new Item("item1", 10.0), new Item("item2", 20.0) ); // When double total = calculator.calculateTotal(items); // Then assertThat(total).isEqualTo(30.0); } ``` ## 性能优化 - **算法复杂度**:选择合适的算法和数据结构 - **缓存策略**:合理使用缓存减少重复计算 - **懒加载**:对于昂贵的操作使用懒加载 - **批量处理**:批量处理数据库操作和网络请求 ## 代码质量 - **单一职责**:每个类和方法只负责一个功能 - **开闭原则**:对扩展开放,对修改关闭 - **依赖倒置**:依赖抽象而不是具体实现 - **接口隔离**:使用小而专一的接口 - **代码复用**:提取公共逻辑,避免重复代码 ## 文档和注释 - **JavaDoc**:为公共API编写完整的JavaDoc - **代码注释**:为复杂逻辑添加解释性注释 - **TODO标记**:使用TODO标记待完成的工作 ```java /** * 计算用户积分 * * @param userId 用户ID * @param actions 用户行为列表 * @return 计算得出的积分值 * @throws UserNotFoundException 当用户不存在时抛出 */ public int calculatePoints(Long userId, List actions) { // TODO: 实现积分计算逻辑 return 0; } ```